第十八:Pytest中的yield操作退出清理数据 一.项目目录二.yield关键字1.它不是单独存在要写在fixtrue标记的固件中。2.在声明的固件fixture中加入yield关键字在它下面写测试用例其他有关于固件的使用没有任何差别。3.fixture里面的teardown用yield来唤醒teardown的执行。4.如果测试用例中的代码出现异常或者断言失败并不会影响它的固件中yield后的代码执行。但是如果固件中的yield之前的代码也就是相当于setup部分的带代码出现错误或断言失败那么yield后的代码将不会再执行当然测试用例中的代码也不会执行。三.fixture的作用域scope1.scope“function”1.1.当pytest.fixture(scopefunction)时每个方法函数都会执行一次test_yield_function.py# 当pytest.fixture(scopefunction) 时每个方法函数都会执行一次。importpytestpytest.fixture(scopefunction)deflogin():print(u登录成功)yieldprint(u用例执行完成收尾)deftest_one(login):print(u操作1)deftest_two(login):print(u操作2)deftest_three(login):print(u操作3)if__name____main__:pytest.main([-s,test_yield_function.py])#此时test1test2test3三个地方都调用了login函数并且它会在每一个用例前执行一次。1.2.如果test1不调用test2调用logintest3不调用运行顺序会是怎样的test_yield_function.pyimportpytestpytest.fixture(scopefunction)deflogin():print(u登录成功)yieldprint(u用例执行完成收尾)deftest_one():print(u操作1)deftest_two(login):print(u操作2)deftest_three():print(u操作3)if__name____main__:pytest.main([-s,test_yield_function.py])#function级别的fixture在用例test2调用前执行一次。2.scope“module”2.1.fixture参数scope”module”module作用是整个.py文件都会生效 整个文件只会执行一次用例调用时参数写上函数名称就行。test_yield_module.py# 当fixture参数scope”module”module作用是整个.py文件都会生效 整个文件只会执行一次用例调用时参数写上函数名称就行。importpytestpytest.fixture(scopemodule)deflogin():print(u登录成功)yieldprint(u用例执行完成收尾)deftest_one(login):print(u操作1)deftest_two(login):print(u操作2)deftest_three(login):print(u操作3)if__name____main__:pytest.main([-s,test_yield_module.py])2.2.如果test1不调用test2调用logintest3不调用运行顺序会是怎样的test_yield_module.pyimportpytestpytest.fixture(scopemodule)deflogin():print(u登录成功)yieldprint(u用例执行完成收尾)deftest_one():print(u操作1)deftest_two(login):print(u操作2)deftest_three():print(u操作3)if__name____main__:pytest.main([-s,test_yield_module.py]#module级别的fixture只会在用例test2调用前执行一次。三.yield执行teardown1.fixture里面的teardown用yield来唤醒teardown的执行test_yield_module_one.pyimportpytestpytest.fixture(scopemodule)deflogin():print(u登录成功)yieldprint(u执行teardown!)print(u用例执行完成收尾)deftest_one(login):print(u操作1)deftest_two(login):print(u操作2)deftest_three(login):print(u操作3)if__name____main__:pytest.main([-s,test_yield_module_one.py])四.yield遇到异常1.如果其中一个用例出现异常不影响yield后面的teardown执行运行结果互不影响并且在用例全部执行完之后会呼唤teardown的内容。test_yield_module_two.pyimportpytestpytest.fixture(scopemodule)deflogin():print(u登录成功)yieldprint(u执行teardown!)print(u用例执行完成收尾)deftest_one(login):print(u操作1)# 如果第一个用例异常了不影响其他的用例执行raiseNameError# 模拟异常deftest_two(login):print(u操作2)deftest_three(login):print(u操作3)if__name____main__:pytest.main([-s,test_yield_module_two.py])2.如果在setup就异常那么是不会去执行yield后面的teardown内容。test_yield_module_three.pyimportpytestpytest.fixture(scopemodule)deflogin():# 如果在setup就异常了那么是不会去执行yield后面的teardown内容了assert12print(u登录成功)yieldprint(u执行teardown!)print(u用例执行完成收尾)deftest_one(login):print(u操作1)# 如果第一个用例异常了不影响其他的用例执行#raise NameError # 模拟异常deftest_two(login):print(u操作2)deftest_three(login):print(u操作3)if__name____main__:pytest.main([-s,test_yield_module_three.py])