一.unittest
介绍:
识别指定目录下的以test开头的文件(test*.py)。
在文件中执行继承了TestCase的类中的以test_开头的用例。
想要按照顺序执行时,在test*.py中加入序号就好,如test_01login.py,test_02register.py
1.编写用例(用例名称,用例前置,用例步骤,用例断言,用例后置)
1)用例类型:必须要写在类中,并且类要继承unittest.TestCase,类中用例名称要以test_开头。
2)前置后置用例
2.收集用例并执行(收集到测试套件,并用各种方法去执行)
1)收集用例:TestSuite类
①addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。
suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest('test_baidu'))
TestSuite类内部有run()方法,可以直接运行套件中的用例,但是没有相应的文本或HTML等测试结果文件的输出,它只是执行了一遍,所以不方便查看结果。
②unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动根据测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
runner=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
runner.run()
上面的方法也是直接用套件自带的run()方法运行用例,所以也是没有相应的文本或HTML等测试结果文件的输出,它只是执行了一遍,不方便查看结果。
③unittest.TestLoader().discover():和第二个方法原理一样。上面的方法点击进去就会发现底层逻辑如下。
defaultTestLoader = TestLoader()
所以直接使用TestLoader类时用法应该是:
runner=unittest.TestLoader().discover(test_dir, pattern='test_*.py')
runner.run()
2)执行用例(带输出的那种,文本文件或是html文件)
①TextTextRunner()类:通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。用法如下:
with open('result_unittest.txt', 'w+', encoding='utf-8') as file:
runner = unittest.TextTestRunner(file, descriptions="asdf", verbosity=2)
runner.run(suite)
生成的测试结果报告为文本形式。
②HTMLTestRunner类:第三方模块中的类,里面有run()方法,入参为suite测试套件。
③BeautifulReport使用方法:
from BeautifulReport import BeautifulReport
br=BeautifulReport(suite)
br.report("测试报告名称","bfreport.html")
④unittestreport(基于unittest二次开发的功能扩展库)
文档地址:gitee.com/lemon-test-official/unittestreport
除了可以生成html的测试报告外,还有失败重运行,并发执行用例等功能。
详细用法看文档。
3)默认执行顺序:
①同一层级的文件名通过ASC码排序,先找到的文件,先收集里面的用例
②不同层级的文件:从外到内,即先把外层目录下的收集完成后,在找文件夹里面的
③文件当中的用例执行顺序:从上到下,按照代码顺序。
4)过滤文件和用例:识别测试用例规则
识别指定目录下的以test开头的文件(test*.py)。
在文件中执行继承了TestCase的类中的以test_开头的用例。
想要按照顺序执行时,在test*.py中加入序号就好,如
test_01login.py,test_02register.py
二.pytest
介绍:
提供编写用例,收集用例,运行用例及输出测试报告的功能。
并且能识别并收集unittest的用例。断言时直接使用assert表达式即可。
pip install pytest,在main文件里收集用例时导入。
有模块级别/会话级别的fixtrue
在单个测试文件里执行时不用导入也可。
1.编写用例(用例名称,用例前置,用例步骤,用例断言,用例后置)
1)用例类型:可以写在类中,也可以直接写一个函数,都能被框架识别为测试用例;测试类不必像unittest一样继承TestCase类。
2)前置后置用例:支持两种,类unittest的,或是使用fixture
2.收集用例并执行---自动收集用例(选定目录,过滤文件,过滤用例)
1)选定目录:
命令行:输入pytest执行,可以在当前项目目录下自动收集到符合pattern的用例。
main.py文件:导入pytest,调用pytest.main()。效果是当前代码所在文件在哪个目录下,就以哪个目录为rootdir去搜索用例并收集。
2)默认执行顺序:
①同一层级的文件名通过ASC码排序,先找到的文件,先收集里面的用例
②不同层级的文件:从外到内,即先把外层目录下的收集完成后,在找文件夹里面的
③文件当中的用例执行顺序:从上到下,按照代码顺序。
3)过滤文件和用例:识别测试用例规则
识别以test_开头,或以_test结尾的文件(test_*.py)
识别以Test开头的类(class Test*)类中不能有init方法,类中以test_开头的方法
以test_开头的函数
3.输出报告
第一个是需要和jenkins集成时要用。生成这种格式的文件后,jenkins就能从中识别用例总数以及成功和失败的用例数量。
第二个用不上,就是在控制台输出的那种。
常用的是allure。
-allure测试报告
文档地址:docs.qameta.io/allure/
mac电脑安装allure可以使用命令:brew install allure
allure与pytest结合使用,需要安装插件,如上图的第二步。
问题1:allure工具怎样才能获取测试结果并展示?
pytest不能只是运行,需要生成allure工具可以解析的测试结果文件。
问题2:pytest怎么能生成allure工具可以解析的文件?
在pytest中安装allure插件,如上图的第二步,然后通过在命令行加参数,就能生成。
a.生成解析文件。
如上图的命令,意为在相对于根目录下的目录中生成allure工具可以解析的文件。
b.使用allure工具,去展现2当中的测试结果。
跳转到rootdir下,cmd中运行:allure serve /tmp/my_allure_results(serve后面的地址为测试结果文件相对路径)
c.执行的同时删除上次执行时生成的解析文件,保证测试报告中数据的正确性
4.其他细分功能
1)pytest的mark功能
详细的mark功能可以查看下面这个文章,讲的很详细。
pytest系列(二) - 筛选用例新姿势,mark 一下,你就知道。 - 简---- - 博客园
在执行只有一个mark时的命令需要将-m和mark分开输入,我也不知道为啥,但反正写到一起就会报错:
在执行有多个mark时的命令就可以正常的将-m和nark放在一起。
上图中的例子是执行同时拥有login和demo两个标签的,如果想要执行有login的或者有demo的,那么用or连接即可
2)pytest的fixture功能
详细的可以看:pytest系列(三) - fixture 的多样玩法 - 简---- - 博客园
①类unitstyle的夹具
有函数,类,和模块级别的夹具。用法和unittest中的夹具一样。
②使用fixture的夹具
-定义fixture
-在用例中主动调用fixture
-fixture支持全局共享&层级共享
3)pytest参数化
4)pytest重运行
当碰到了运行失败的用例时,使用重运行机制会即时重运行,不会等到所有用例执行结束后再执行。
(即时重运行更合理,因为环境还有前置工作等都还在。)
5)pytest-allure测试报告
allure的更多玩法:testingpai.com/article/1595507295429
Pytest学习笔记5——Allure测试报告用例详细描述_像蚂蚁一样工作,像蝴蝶一样生活-CSDN博客_allure用例描述
6)指定用例的执行顺序: