unittest自动化测试-基本概念、用法

0 自动化测试

0.1 分层自动化测试

(1)单元自动化测试

(2)接口自动化测试

(3)UI自动化测试

0.2 适合自动化测试的项目

(1)软件需求变动不频繁

(2)项目周期长

(3)自动化测试脚本可重复使用

一、unittest基本概念

1.1 unittest

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

1.1.1 单元测试框架

单元测试框架:指的是在编程过程中,针对程序的最小单元(函数,方法)进行正确性的测试框架。

1.1.2 自动化测试框架

自动化测试框架:(1)提高测试效率,降低维护成本;(2)提高测试准确性,增加代码的重用性和可靠性;

单元测试框架是自动化测试框架的其中组成部分,主要用于管理和运行测试用例。

1.1.3 单元测试框架对比

python:unittest,pytest

java:junit,testing

1.2 各模块的作用

  • TestCase,测试用例:一个测试用例是一个独立的测试单元,最小单元,业务逻辑。它检查输入特定的数据时的响应。 unittest 提供一个基类: TestCase ,用于新建测试用例。可以说是unittest中最重要的一个类,也是测试用例类的父类,通过对其继承,使子类具备了执行测试的能力。
  • TestSuite ,测试套件:多个测试用例集合在一起,就是TestSuite。 一组测试用例的集合,或者测试套件的集合。TestSuite类用于创建测试套件。最常见的用法是,使用该类将多个测试用例添加到用例集,通过运行用例集,实现多个测试用例的执行。
  • TestLoader,测试加载器:是用来加载TestCase到TestSuite中的
  • TestRunner,测试运行器:主要使用该类的run()方法来运行TestSuite添加好的测试用例,是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
  • Testfixture,测试夹具:执行测试用例之前和之后的操作。表示tests运行前需要做的准备工作以及结束后的清理工作。比如,创建临时/代理数据库、目录或启动一个服务器进程。

 

1.3 导入unittest

import unittest #导入unittest模块

import HTMLTestRunner #导入HTMLTestRunner 报告模板模块

from BeautifulReport import BeautifulReport #导入BeautifulReport 报告模板模块

1.4 生成测试报告的方式

报告模板HTMLTestRunner模块

报告模板BeautifulReport

1.5 基本用法

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

运行结果:

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

(1)import unittest  #第一行是导入 unittest 这个模块;

(2)class TestStringMethods(unittest.TestCase)  #class 这一行是定义一个测试的类,并继承 unittest.TestCase 这个类;

(3)test_upper、test_isupper、test_split为测试用例:测试用例的名称要以 test 开头;

(4).assert 为断言,断言其实就是拿实际结果和期望结果去对比;

如:

   def testSubtract(self):  # test method names begin with 'test'
        result = 6-5   #实际结果
        hope = 1       #期望结果
        self.assertEqual(result, hope)

 (5)unittest.main()是运行主函数,运行后会看到测试结果;

1.6 使用 unittest.TestSuite

"""
1. 测试用例
2. 容器,容器添加测试用例
3. 运行容器中的测试用例
"""
import unittest
​
# 测试类,继承于unittest.TestCase
class MyTest(unittest.TestCase):
    def test_1(self):
        print('test_1')
​
    def test_2(self):
        print('test_2')
​
if __name__ == '__main__':
    # 类的外面
    # 2. 容器,容器添加测试用例
    suite = unittest.TestSuite()
    # 测试用例的执行顺序,按添加的顺序执行
    suite.addTest(MyTest('test_1'))
    suite.addTest(MyTest('test_2'))
​
    # 3. 运行容器中的测试用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

运行结果:

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
test_1
test_2 

Process finished with exit code 0

1.7 unittest的运行方式

1. 命令行的运行方式

python -m :以脚本(命令行)的方式来运行测试用例。

-v:以表详细的方式运行测试用例。 

 

 2、通过main运行

 1.8 测试用例的运行结果

 1.9 测试用例的执行顺序

 1.10 unittest多种测试用例加载方式

1、通过套件加载测试用例

 2、加载一个目录下所有的测试用例

二、unittest 各模块详解

2.1 unittest模块的各个属性说明

(1)unittest.TestCase:TestCase类,所有测试用例类继承的基本类

(2)unittest.main():使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行它们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

(3)unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。

(4)unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。

(5)unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。

discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

(6)unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。

2.1.1 TestCase类的属性

(1)setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

(2)tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

(3)assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

  • assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。
  • assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。
  • assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。
  • assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。
  • assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。
  • assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。
  • assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。
  • assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。
  • assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。
  • assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。
  • assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。
  • assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。

2.1.2 TestSuite类的属性

(1)addTest()

addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。

suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest('test_baidu')) 

 2.1.3 TextTextRunner的属性

run(): run()方法是运行测试套件的测试用例,入参为suite测试套件。

runner = unittest.TextTestRunner()
runner.run(suite)

参考文献:

【1】单元测试unittest及报告生成(两种报告模板) - 我已不爱凯蒂 - 博客园

【2】 unittest --- 单元测试框架 — Python 3.10.4 文档

【3】python接口自动化(二十一)--unittest简介(详解) - 北京-宏哥 - 博客园

【4】unittest_核心概念(进阶) - Old_Arthurㄟ - 博客园 

【5】Python 单元测试(unittest)_来玩魔王的咚!的技术博客_51CTO博客 

【6】 Python XML 解析 | 菜鸟教程

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值