第十八:Pytest中的yield操作退出清理数据
一.项目目录
二.yield关键字
1.它不是单独存在,要写在fixtrue标记的固件中。2.在声明的固件fixture中加入yield关键字,在它下面写测试用例,其他有关于固件的使用没有任何差别。3.fixture里面的teardown用yield来唤醒teardown的执行。4.如果测试用例中的代码出现异常或者断言失败,并不会影响它的固件中yield后的代码执行。但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。三.fixture的作用域scope
1.scope=“function”
1.1.当pytest.fixture(scope="function")时,每个方法(函数)都会执行一次test_yield_function.py
# 当pytest.fixture(scope="function") 时,每个方法(函数)都会执行一次。importpytest@pytest.fixture(scope="function")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"])#此时test1,test2,test3三个地方都调用了login函数,并且它会在每一个用例前执行一次。1.2.如果test1不调用,test2调用login,test3不调用,运行顺序会是怎样的?test_yield_function.py
importpytest@pytest.fixture(scope="function")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文件都会生效( 整个文件只会执行一次),用例调用时,参数写上函数名称就行。importpytest@pytest.fixture(scope="module")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调用login,test3不调用,运行顺序会是怎样的?test_yield_module.py
importpytest@pytest.fixture(scope="module")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执行teardown
1.fixture里面的teardown用yield来唤醒teardown的执行test_yield_module_one.py
importpytest@pytest.fixture(scope="module")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.py
importpytest@pytest.fixture(scope="module")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.py
importpytest@pytest.fixture(scope="module")deflogin():# 如果在setup就异常了,那么是不会去执行yield后面的teardown内容了assert1==2print(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"])