大家好,我是杨叔。每天进步一点点,关注微信公众号【程序员杨叔】,了解更多测试开发技术知识!
自动化测试时必然会碰到用例执行前,需要做一些前置操作,以及用例执行后,需要做一些后置操作的时候。本文主要通过:conftest.py中结合@pytest.fixture()实现用例前置、后置操作,比如:登录和退出。
同时也主要想说明白以下几点:
1.什么是conftest.py?
2.什么是pytest.fixture?
3.pytest的setup和teardown也能实现用例的前置和后置操作,为什么还要用fixture呢?
介绍:pytest里面默认读取conftest.py里面的配置,conftest.py配置脚本名称是固定的,不能改名称,是单独存放的一个家居配置文件。
原则上,conftest.py与运行的用例要在同一个pakage下,并且有init.py文件,用处可以在不用的py文件中使用同一个fixture函数。
conftest.py 文件的作用:conftest.py 配置里可以实现数据共享,不需要import导入 conftest.py,pytest用例会自动查找
介绍:fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数,适合于那些许多测试用例都只需要执行一次的操作,比如登录和退出操作。主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。
使用:在函数声明之前加上“@pytest.fixture”。其他函数要来调用这个Fixture,只用把它当做一个输入的参数即可
@pytest.fixture(scope=“function”, params=None, autouse=False, ids=None, name=None)
scope:有四个级别参数 "function" (默认), "class", "module" or "session"
scope参数为session,那么所有的测试文件执行前执行一次
scope参数为module,那么每一个测试文件执行前都会执行一次
scope参数为class,那么每一个测试文件中的测试类执行前都会执行一次
scope参数为function,那么每一个测试文件中的每一个测试用例执行前都会执行一次
params:fixture可以带参数,可以把参数赋值给params,默认是None。对于param里面的每个值,fixture都会去调用执行一次,就像执行for循环一样把params里的值遍历一次
autouse: 默认值为False,只有方法调用了fixture,才可以执行。如果设置为True,则所有测试的方法都自动执行,一般不会设置为True。
yield关键字:fixture 使用yield关键字实现后置操作。另外如果前置操作要返回值,直接在yield后面加上要返回的值即可。也就是yield既可以实现后置,又可以起到return返回值的作用
pytest的setup和teardown也能实现用例的前置和后置操作,为什么还要用fixture呢?
答案是fixture更灵活,可以灵活的自定义测试用例的预置条件,想用在哪里就用在哪里,不想用的地方也不会被影响到。
比如:一个py文件中,用例1需要先登录,用例2不需要登录,用例3需要先登录, 很显然这就无法用setup和teardown来实现了。而通过conftest.py和fixture,则用例1和3调用fixture,用例2不调用即可达成目的。
conftest.py代码:
# 获取到登录请求返回的ticket值,@pytest.fixture装饰后,testcase文件中直接使用函数名"login_ticket"即可得到ticket值
@pytest.fixture(scope="session")
def login_ticket():
header = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
params = {
"loginId": "username",
"pwd": "password",
}
url = 'http://testxxxxx.xx.com/doLogin'
logging.info('开始调用登录接口:{}'.format(url))
res = requests.post(url, data=params, headers=header, verify=False) # verify:忽略https的认证
try:
ticket = res.headers['Set-Cookie']
except Exception as ex:
logging.error('登录失败!接口返回:{}'.format(res.text))
traceback.print_tb(ex)
logging.info('登录成功,ticket值为:{}'.format(ticket))
return ticket
#测试一下conftest.py文件和fixture的作用
@pytest.fixture(scope="session")
def login_test():
print("运行用例前先登录!")
# 使用yield关键字实现后置操作,如果上面的前置操作要返回值,在yield后面加上要返回的值
# 也就是yield既可以实现后置,又可以起到return返回值的作用
yield "runBeforeTestCase"
print("运行用例后退出登录!")
test.py代码:
import pytest
def test1(login_test):
print("运行test1()")
print("测试conftest传值:{}".format(login_test))
=========================================================
以上就是本篇文章的全部内容,如果对你有帮助,
欢迎搜索关注【程序员杨叔】的微信公众号,获取更多测试开发干货内容资料,一起交流成长