4.2 pytest装饰器
pytest的装饰器如表5所示。
表5 pytest的装饰器
装饰器 |
解释 |
setup_module/teardown_module |
在所有测试用例执行之前和之后执行。 |
setup_function/teardown_function |
在每个测试用例之前和之后执行。 |
setup_class/teardown_class |
在当前测试类的开始与结束执行。 |
setup/treadown |
在每个测试方法开始与结束执行。 |
setup_method/teardown_method |
在每个测试方法开始与结束执行,与setup/treadown级别相同。 |
4.3 pytest 常用命令行选项
Pytest的强大之处在于它可以通过命令行来对测试用例进行控制,比如案例4使用了-s参数,表示在终端中允许测试运行的时候输出某些结果,包括任何符合标准输出信息。由于程序里面有print语句,所以必须使用-s参数。-v参数可以使输出信息更详细,把main语句改为。
pytest.main(["-sv","test_Calculator.py"])
输出结果变为。
[1m============================= test sessionstarts =============================[0m platform win32 -- Python 3.7.1, pytest-4.0.2,py-1.7.0, pluggy-0.8.0 -- C:\Python37\pythonw.exe cachedir: .pytest_cache rootdir: C:\python\unittest, inifile: [1mcollecting ... [0m[1m collected 12 items [0m test_Calculator.py::TestCalculator::test_base 测试开始 [32mPASSED[0m test_Calculator.py::TestCalculator::test_max_number[32mPASSED[0m test_Calculator.py::TestCalculator::test_subs [32mPASSED[0m test_Calculator.py::TestCalculator::test_mysubs_0 [32mPASSED[0m test_Calculator.py::TestCalculator::test_mysubs_1 [32mPASSED[0m test_Calculator.py::TestCalculator::test_mysubs_2 [32mPASSED[0m test_Calculator.py::TestCalculator::test_multiply [32mPASSED[0m test_Calculator.py::TestCalculator::test_mymultiply_0[32mPASSED[0m test_Calculator.py::TestCalculator::test_mymultiply_1[32mPASSED[0m test_Calculator.py::TestCalculator::test_mymultiply_2[32mPASSED[0m test_Calculator.py::TestCalculator::test_mymultiply_3[32mPASSED[0m test_Calculator.py::TestCalculator::test_divide 除数不能为零 [32mPASSED[0m测试结束 [32m[1m========================== 12 passed in0.63 seconds ==========================[0m
明显清晰了很多。对于命令行参数可以通过下面语句获得,在这里不做更多介绍。
C:\Users\Jerry>pytest --help
4.4 pytest 运行并发测试
要让pytest实现并发测试,必须先安装pytest-parallel。
pip install pytest-parallel
另外要注意这个插件仅仅支持python3.6版本及以上,而且如果想多进程并发,就必须跑在Unix或者Mac机器上,Windows环境仅仅支持多线程运行。运行时需要指定以下参数。
- workers (optional) X。多进程运行, X是进程数。默认值1。
- tests-per-worker (optional) X. 多线程运行, X是每个worker运行的最大并发线程数。默认值1。
案例9:用pytest框架实现并发测试。
#coding=utf-8 import pytest @pytest.mark.release class TestClass1(object): def test_one(self): x = "this" assert 'h' in x def test_two(self): x = "hello" assert hasattr(x,'check') class TestClass2(object): def test_one(self): x = "this" assert 'h' in x def test_two(self): x = "hello" assert hasattr(x,'check')#判断x对象中是否存在name属性'check' #terminal里输入 pytest TesterTalk.py --workers 2 #指定2个进程并发 #terminal里输入 pytest TesterTalk.py --workers 2 --test-per-worker 3 #指定2个进程并发,每个进程最多运行3个线程。 if __name__ == '__main__': pytest.main('-sv --workers2 TesterTalk.py')
4.5 配合allure生成pytest 测试报告
pytest可以通过allure生成很漂亮的测试报告,在Windows下配置如下。
- 配置Java环境(运行allure 需要)
- 安装powershell(Windows 10自带)
- 在powershell中输入 Set-ExecutionPolicy RemoteSigned-scope CurrentUser
- 安装scoop方法:运行 powershell 输入, iex (new-objectnet.webclient).downloadstring('https://get.scoop.sh') 然后根据提示安装即可
- 安装allure :scoop install allure
- 生成报告:allure serve 测试的xml路径
- allure open -h 127.0.0.1 -p 8083 .\report\report\
为了方便期间,可以在测试用例同目录建立文件report.bat,内容如下。
allure serve .\report\xml\ allure open -h 127.0.0.1 -p 8083 .\report\report\
1. Features定制
案例10:配合allure生成pytest 测试报告之Features定制。
# -*- coding: utf-8 -*- import allure import pytest from Calculator import calculator from Util import util @allure.feature('test_module_01') @allure.story('test_story_01') def test_case_01(): j=calculator(4,2) util.AssertEqual(j.myadd(),6) util.AssertEqual(j.mysubs(),2) util.AssertEqual(j.mymultiply(),8) util.AssertEqual(j.mydivide(),2) @allure.feature('test_module_01') @allure.story('test_story_02') def test_case_02(): j=calculator(9223372036854775808,9223372036854775808) util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864) if __name__ == '__main__': pytest.main(['-s', '-q', '--alluredir', './report/xml'])
测试报告如图31所示。
图31 配合allure生成pytest 测试报告之Features定制
Title和Desc定制
案例11:配合allure生成pytest 测试报告之Title和Desc定制。
# -*- coding: utf-8 -*- import allure import pytest from Calculator import calculator from Util import util @allure.feature('test_module_01') @allure.story('test_story_01') #test_case_01为用例title deftest_case_01(): """ 用例描述:这是用例描述,Test case 01,描述本人 """ #注释为用例描述 j=calculator(9223372036854775808,9223372036854775808) util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864) if __name__ == '__main__': pytest.main(['-sv', '-q', '--alluredir', './report/xml'])
测试报告如图32所示。
图32 配合allure生成pytest 测试报告之Title和Desc定制
星云测试
奇林软件
联合通测
顾翔凡言:
k=(p+m)t
其中:
k为常数。
p:团队人员质量水平,为单位小时内产生的有效质量,单位为/h;
m:团队方法质量水平,为单位小时内产生的有效质量,单位为/h;
t:为单位质量产品的交付时间,单位为h。
在团队方法质量水平不变,团队人员质量水平提高的情况下,交付时间变短;
在团队人员质量水平不变,团队方法质量水平提高的情况下,交付时间变短;
团队人员质量水平与方法质量水平乘积决定了软件的质量水平,如果这个值变小,则t变大;反之t变小。
例如,当k=4时:
当人员质量水平为1/小时、方法水平为1/小时时,交付时间为2小时。
当人员质量水平为2/小时、方法水平为1/小时时,交付时间为4/3小时。
当人员质量水平为1/小时、方法水平为2/小时时,交付时间为4/3小时。
当人员质量水平为0.5/小时、方法水平为0.5/小时时,交付时间为4小时。