pytest框架的前后置(固件,夹具)处理,三种方法:
class TestLogin:
def setup_class(self):
print("每个类之前执行的的操作,比如创建日志对象、创建数据库连接、创建接口的请求对象")
def setup(self):
print("每个用例前执行的操作,比如打开浏览器、加载网页")
def teardown(self):
print("每个用例后执行的操作,比如关闭浏览器")
def teardown_class(self):
print("每个类之后执行的操作,比如销毁日志对象、销毁数据库连接、销毁接口的请求对象")
@pytest.mark.skip("跳过原因:本轮不执行")
def test_login_001(self):
print("用例001")
@pytest.mark.run(order=1)
def test_login_002(self):
print("用例002")
#注意:全部时小写
@pytest.fixture(scope="", params="", autouse="", ids="", name="")
scope表示的是@pytest.fixtur标记方法的作用域,function(默认),class,module,package/session
params:参数化 ,支持列表[],元组(),字典列表[{},{},{}],字典元组({}.{},{})
autouse=True:自动执行,默认为False,不会自动执行,需要手动调用
ids:当使用params参数化时,给每一个值设置一个变量名,意义不大
name:给被@pytest.fixtur标记的方法取一个别名
@pytest.fixture(scope='class', autouse=True)
def my_fixture_class():
print("类前置")
yield #yield相当于teardown,下面写teardown的操作
print("类后置")
#scope='class'时,标记的方法my_fixture_class()等价于 setup_class/teardown_class
@pytest.fixture()
def my_fixture_function():
print("用例前置")
yield
print("用例后置")
#scope='function'或没有scope时(因为scope默认为function),标记的方法my_fixture_function()等价于setup/teardown
class TestApiinner:
def test_inner_api_001(self):
print("api用例001")
def test_inner_api_002(self, my_fixture_function):
# autouse默认为False,不会自动执行,可以在用例中调用@pytest.fixture()标记的方法来执行夹具,传入的是方法对象,不能带括号。
print("api用例002")
def test_inner_api_003(self):
print("api用例003")
class TestApiForOut:
def test_for_out_api_001(self):
print("api用例001")
def test_for_out_api_002(self):
print("api用例002")
def test_for_out_api_003(self):
print("api用例003")
if __name__ == '__main__':
pytest.main()
可以用多个@pytest.fixture()分别标记多个方法,来实现和setup/teardown,setup_class/teardown_class相同的效果
@pytest.fixture(params=['盖伦', '寒冰', '剑圣'],ids=['gl','hb','js'])
'''
如果使用name参数,如@pytest.fixture(params=['盖伦', '寒冰', '剑圣'],ids=['gl','hb','js'], name='aaa'),
则定义的方法名my_fixture_function将不能再使用,后面的调用都必须使用别名aaa
'''
def my_fixture_function(request):
print("用例前置")
yield request.param #return和yiled都是表示返回的意思,但是return后面不能有代码,yiled返回可以接代码
print("用例后置")
class TestApiinner:
def test_inner_api_001(self, my_fixture_function):
print(str(my_fixture_function)+"执行了内部api用例001")
def test_inner_api_002(self):
print("内部api用例002")
all_fixture()定义在testcase目录下 ,可供全局的用例使用
api_fixture()定义在test_api目录下,仅可在当前目录内使用
all_fixture()和api_fixture()可以同时使用,会按照先后顺序执行
- class TestApiForOut:
def test_for_out_api_001(self, all_fixture, api_fixture):
print("\n对外api用例001")
def test_for_out_api_002(self, api_fixture):
print("\n对外api用例002")
def test_for_out_api_003(self, all_fixture):
print("\n对外api用例003")
assert
入门阶段学习的测试报告插件:pytest-html
进阶阶段学习的测试报告插件:allure-pytest
下载地址:allure下载
allure的path路径:将allure的bin目录添加至环境变量path
验证:allure --version
Q&A:
1、dos可以验证,但是在pycharm验证失败? --重启pycharm
2、未安装jdk的同学需要下载安装jdk,jdk下载
在pytest中增加参数 --alluredir ./临时文件目录
如:addopts = -vs --alluredir ./tmp
if __name__ == '__main__':
pytest.main()
os.system('allure generate ./tmp -o ./report --clean')
allure generate 命令,生成报告
./tmp 临时的json格式报告路径
-o 输出 output
./report 生成的allure报告路径
–clean 清空这个目录下原来的报告
1.创建虚拟环境项目时,虚拟环境本地Terminal:此系统禁止脚本运行,导致安装的插件未在虚拟环境安装成功以及后续一系列神奇的问题:主函数运行失败,命令行可以运行成功;主函数运行结果和命令行运行结果不一样。
处理方法:用管理员身份运行 PowerShell,然后输入set-executionpolicy remotesigned
,再输入y确认即可