2025年测试框架(unittest)

测试框架(unittest)Untitest 简介 unittest 是 Python 自带的一个单元测试 框架 unittest 又被称为 PyUnit 是由 Java 的 JUnit 衍生而来 基本结构是类似的 对于单元测试 需要设置预先条件 对比预期结果和实际结果 不需要单独再去安装 引入包 import unittest 即可使用 什么要使用 unittest

大家好,我是讯享网,很高兴认识大家。

Untitest简介

unittest是Python自带的一个单元测试框架,unittest又被称为PyUnit,是由Java的JUnit衍生而来,基本结构是类似的。对于单元测试,需要设置预先条件,对比预期结果和实际结果。不需要单独再去安装。引入包import unittest即可使用。

什么要使用unittest

当我们写的自动化用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具。

unittest的书写方式:

1.测试文件必须以test开头

2.测试类必须以Test开头

3.测试类必须继承unittest.TestCase

4.测试方法必须以test开头

5.在测试的.py文件里去执行代码  unittest.main()

6.在测试类里面可以有普通方法,但是普通方法必须要被测试方法调用

unittest核心的四个概念:

test case:测试用例

test fixture:测试夹具

test suite:测试套件

test runner:测试执行

相关操作

test fixture 测试夹具

语法:

方法级别:

setUp()==>在每个测试方法执行之前执行

setDown()==>在每个测试方法执行完之后执行

类级别:

setUpClass:()==>在每个类执行之前执行,需要使用@classmethod进行装饰

setDownClass==>在每个类执行之后开始执行,需要使用@classmethod进行装饰

用例执行顺序

- 默认执行顺序: 对用例名称按照ASCII字符集排序

- 控制用例执行顺序: 给用例名称添加序号  test_01

断言方法

常用的断言方法

断言方法名称

使用方法

验证

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的一个实例,不是则测试用例通过。

断言示例

1.import unittest   2."""  3.断言方法  4."""   5.class TestDemo(unittest.TestCase):   6.    def test_case1(self):   7.        print('test_case1')   8.        self.assertEqual(1+1,2,'用例失败')   9.    def test_case2(self):   10.        print('test_case2')   11.        self.assertEqual(1+1,3,'用例失败')   12.if __name__ == '__main__':   13.    unittest.main()  

讯享网

执行结果:

test_case1方法断言成功;

test_case2方法断言失败。

跳过测试

当测试用例写完后,有些模块有改动时候,会影响到部分用例的执行,这个时候我们希望暂时跳过这些用例。或者前面某个功能运行失败了,后面的几个用例是依赖于这个功能的用例,如果第一步就失败了,后面的用例也就没必要去执行了,直接跳过就行,节省用例执行时间。

当执行有想要跳过的测试,我们可以通过skip、skipIf、skipUnless装饰器跳过某个测试方法/测试类,或者用TestCase.skipTest()方法跳过某个测试方法。


讯享网

常用的跳过测试方法/装饰器

@unittest.skip(reason):skip(reason)装饰器,无条件跳过装饰的测试,并说明跳过测试的原因。

@unittest.skipIf(reason):skipIf(condition,reason)装饰器,条件为真时,跳过装饰的测试,并说明跳过测试的原因。

@unittest.skipUnless(reason):skipUnless(condition,reason)装饰器,条件为假时,跳过装饰的测试,并说明跳过测试的原因

使用装饰器跳过测试方法

讯享网1.import unittest   2."""  3.跳过测试(跳过方法)  4."""   5.class TestDemo(unittest.TestCase):   6.    def test_case1(self):   7.        print('test_case1')   8.    #skip跳过测试   9.    @unittest.skip('跳过用例test_case2')   10.    def test_case2(self):   11.        print('test_case2')   12.    #skipIf当condition为True时跳过   13.    @unittest.skipIf(0 > 1,'不跳过用例test_case3')   14.    def test_case3(self):   15.        print('test_case3')   16.    # skipIf当condition为True时跳过   17.    @unittest.skipIf(0 < 1, '跳过用例test_case4')   18.    def test_case4(self):   19.        print('test_case4')   20.    # skipUnless当condition为False是跳过   21.    @unittest.skipUnless(0 > 1,'跳过用例test_case5')   22.    def test_case5(self):   23.        print('test_case5')   24.    # skipUnless当condition为False是跳过   25.    @unittest.skipUnless(0 < 1, '不跳过用例test_case6')   26.    def test_case6(self):   27.        print('test_case6')   28.    # 测试标记为失败   29.    @unittest.expectedFailure   30.    def test_case7(self):   31.        print('test_case7')   32.if __name__ == '__main__':   33.    unittest.main()  

运行结果:

test_case1方法执行;

test_case2方法使用skip装饰器,跳过不执行;

test_case3方法使用skipIf装饰器,条件为假,执行;

test_case4方法使用skipIf装饰器,条件为真,跳过不执行;

test_case5方法使用skipUnless装饰器,条件为假,跳过不执行;

test_case6方法使用skipUnless装饰器,条件为真,执行;

test_case7方法使用expectedFailure装饰器,测试标记为失败。

使用装饰器跳过测试类

1.import unittest   2."""  3.跳过测试(跳过类)  4."""   5.class TestDemo1(unittest.TestCase):   6.    def test_case1(self):   7.        print('test_case1')   8.    def test_case2(self):   9.        print('test_case2')   10.@unittest.skip('跳过测试类TestDemo2')   11.class TestDemo2(unittest.TestCase):   12.    def test_case3(self):   13.        print('test_case3')   14.    def test_case4(self):   15.        print('test_case4')   16.if __name__ == '__main__':   17.    unittest.main()  

运行结果:

TestDemo1类执行(执行方法test_case1、test_case2);

TestDemo2类使用skip装饰器,跳过不执行(类里方法test_case3、test_case4也不执行)。

测试套件

方式一:unittest.main()

方式二:unittest.TestSuite()

1.先创建一个测试用例脚本test_Case2.py

讯享网1.import unittest   2.   3."""  4.测试套件:方式二:unittest.TestSuite()  5."""   6.class TestDemo2(unittest.TestCase):   7.    def setUp(self):   8.        print('setUp')   9.    def tearDown(self):   10.        print('tearDowm')   11.   12.    def test_case_a(self):   13.        print('------------test_case_a---------')   14.   15.    def test_case_b(self):   16.        print('------------test_case_b---------')   17.   18.    def test_case_c(self):   19.        print('------------test_case_c----------')   20.   21.if __name__ == '__main__':       unittest.main()

2.再创建执行用例脚本runresult1.py

1.import unittest   2.from test_case.testCase2 import TestDemo2   3."""  4.测试套件:方式二:unittest.TestSuite()--addTest()                                     5."""   6.suite = unittest.TestSuite()   7.suite.addTest(TestDemo2('test_case_b'))   8.suite.addTest(TestDemo2('test_case_a'))   9.runner = unittest.TextTestRunner()   runner.run(suite)

执行runresult.py,执行结果:

(1)构造测试集,实例化测试套件。

suite = unittest.TestSuite()

(2)将测试用例加载到测试套件中。

执行顺序为安装加载顺序:先执行test_case_b,再执行test_case_a,不执行test_case_c(因为没有加载)。

suite.addTest(TestDemo('test_case_b'))

suite.addTest(TestDemo('test_case_a'))

(3)执行测试用例,实例化TextTestRunner类。

runner = unittest.TextTestRunner(verbosity=2)

(4)使用run()方法运行测试套件(即运行测试套件中的所有用例)。

runner.run(suite)

​​​​​​​方式三:unittest.defaultTestLoader.discover()

依然以test_Case2为例,再创建一个runresult2.py文件

脚本如下:

讯享网1.import unittest   2."""  3.测试套件:方式三:unittest.defaultTestLoader()  4."""   5.test_dir = './test_case'#./test_case为根目录下的文件夹路径   6.discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*2.py')   7.runner = unittest.TextTestRunner(verbosity=2)   runner.run(discover) 

运行结果:

(1)构造测试集,使用defaultTestLoader的discover方法查找测试用例文件。

执行顺序是命名顺序:先执行test_case1,再执行test_case2,最后执行test_case3。

test_dir = './test_case'

discover =

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

(2)执行测试用例,实例化TextTestRunner类。

runner = unittest.TextTestRunner(verbosity=2)

(3)使用run()方法运行测试套件(即运行测试套件中的所有用例)。

runner.run(discover)

ddt数据驱动

在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程是一样的。如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成。

环境准备

1.安装ddt模块,打开cmd输入pip install ddt在线安装

>>pip install ddt

 测试数据是列表嵌套列表

1.@ddt.ddt   2.class TestLogin(unittest.TestCase):   3.  4.    @ddt.data(*test_data)   5.    @ddt.unpack  # 只适用数据为列表嵌套列表   6.    def test_login(self, username, password):   7.        print(f"用户名{username}")   8.        print(f"密码{password}")  

数据驱动原理

1.测试数据为多个字典的list类型

2.测试类前加修饰@ddt.ddt

3.case前加修饰@ddt.data()

代码示例:

讯享网1.import unittest   2.import ddt   3.   4.test_data = [   5.    {"username":"abcd","password":"1234",”expect”:True},   6.    {"username":"asdf","password":"3456",”expect”:False},   7.    {"username":"qwer","password":"5432",”expect”:True }   8.]   9.  10.@ddt.ddt   11.class TestDemo2(unittest.TestCase):   12.    def setUp(self):   13.        print("测试开始")   14.   15.    def tearDown(self):   16.        print("测试结束")   17.  18.    @ddt.data(*test_data)   19.    def testCase01(self,data):   20.        '''''测试用例01'''   21.        print(data["username"]+ data["password"]+ data["expect"])   22.   23.if __name__ == '__main__':   24.    unittest.main()  

HTMLTestRunner报告

HTMLTestRunner是Python标准库的unittest单元测试框架的一个扩展。它生成易于使用的HTML测试报告。HTMLTestRunner是在BSD许可证下发布。

首先要下载HTMLTestRunner.py文件。

下载地址:HTMLTestRunner - tungwaiyip's software

注意:下载后的HTMLTestRunner.py文件对Python 3并不支持,使用的时候报错:ImportError: No module named 'StringIO'。示例使用针对Python 3修改好的HTMLTestRunner.py文件。

HTMLTestRunner.py是一个.py文件,将它放到Python安装目录的Lib文件夹下即可调用。

打开命令行,输入python,输入import HTMLTestRunner。如图所示:无任何的错误提示信息,就表示成功。

1、首先新建一个Python项目,如:My_Report_HTMLTestRunner_Demo。

创建case包,用于存放测试用例(test_case1.py、test_case2.py)。

创建plugins包,用于存放生成测试报告扩展文件(HTMLTestRunner.py)。

创建report文件夹,执行脚本指定测试报告生成在此文件夹里。

创建run_all.py为执行测试用例文件。

 run_all.py(执行用例),引入HTMLTestRunner,设置报告名称、描述、报告路径、输出报告详细程度等。

脚本代码:

1.""" 
2.执行用例 
3."""  
4.import unittest, time  
5.import os  
6.import HTMLTestRunner  
7.# 或者将HTMLTestRunner文件拷贝到Python安装目录里的Lib文件夹下  
8.# 获取路径  
9.cur_path = os.path.dirname(os.path.realpath(__file__))  
10.# 测试用例路径  
11.case_path = os.path.join(cur_path, 'test_case1')  
12.# 测试报告路径  
13.report_path = os.path.join(cur_path, 'report')  
14.if __name__ == "__main__":  
15.    # 构造测试集  
16.    suite = unittest.defaultTestLoader.discover(case_path, 'test*.py')  
17.    # 获取当前时间  
18.    now = time.strftime('%Y-%m-%d %H_%M_%S')  
19.    # 定义测试报告  
20.    runner = HTMLTestRunner.HTMLTestRunner(title='自动化测试报告',  
21.                                           description='用例执行情况:',  
22.                                           stream=open(report_path + '\\' + now + ' HTMLReport.html', 'wb'),  
23.                                           verbosity=2  
24.                                           )  
25.  
26.    # 运行测试用例  
    runner.run(suite)
小讯
上一篇 2025-02-20 11:24
下一篇 2025-01-05 21:53

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37165.html