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)

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