测试框架是用来组织测试用例并进行运行控制的。使用框架可以做到:
# test_demo1.py
import requests
def test_1():
assert 1+1 >= 2
def test_2():
res = requests.get('https:/xxxxxx.com')
assert res.status_code == 200
*注意:测试脚本,测试函数名都要以test开头
import requests
class TestDem2(object):
base_url = 'http://add/'
def test_add1():
res = requests.get(self.url, params = {'a':1,'b':2})
assert res.text == 3
def test_add2():
res = requests.get(self.url, params = {'a':-1,'b':2})
assert res.text == 1
注意:
assert 1+1 == 2
assert 1+2 != 2
assert 5 >= 4
assert {'a': 1, 'b': 2} == {'b':2, 'a':1} # 也可用例判断列表和字典相等
assert '百度' in driver.title
assert 1 in [1,2,3]
assert 3>2 is True
assert 3>2 is not False
assert [] is not None
注意:1.is和==的不同,为值相等,is必须内存地址相同(是同一个对象)1True
但 1 is not True。
2.Python中[],{},(),0,‘0’,’'都被视为假,因此可以用assert list1来判断list1不为空。
if __name__ == '__main__':
pytest.main(["test_demo1.py"])
session > module > class > function执行顺序
用于以下场景
import pytest
@pytest.fixture
def my():
print("setup ...")
yield 123
print('teardown')
@pytest.fixture(scope='session', autouse=True)
def my2():
print('my2 setup ...')
注:如果不需要清理方法,yield也可以使用return返回,如果setup出错,用例及teardown则不会执行。
Fixtures方法可以通过注入方式注入到用例中使用,Fixture方法之间也可以相互注入。Fixtures方的主要使用方式有3种:
import pytest
@pytest.mark.usefixtures('my')
def test_a():
print('test_a')
def test_b(my): # fixture方面名直接作为参数使用
print("test_b")
print(my)
def test_c():
print("test_c")
输出:
collected 3 items
test_aaa.py::test_a my2 setup ...
setup ...
test_a
PASSEDteardown
test_aaa.py::test_b setup ...
test_b
123
PASSEDteardown
test_aaa.py::test_c test_c
PASSED
Fixtures方法一般作为公用的辅助方法或全局变量来使用,因此需要在不同用例中都能使用。一般我们用conftest.py这个文件来集中管理Fixtures方法。
生效范围:对conftest.py所在目录及子目录下的所有用例生效。
优先级:用例就近原则。用例文件中的Fixtures方法>当前目录conftest.py中的Fixtures方法>上级目录conftest.py中的Fixtures方法>…
因此,在项目不同模块中使用conftest.py可以实现不同级别的测试准备、清理或辅助方法,如:
在测试用例中,数据的丰富性是非常重要的。同一个测试流程往往需要测试多组数据。我们并不需要把用例复制很多遍然后改为不同的数据。只需要使用数据驱动即可。首先我们需要一个模板,如测试加法接口:
import requests
def test_add():
res = requests.get('/add/?a=1&b=2')
assert res.text == '3'
假如我们要验证1+2=3,-1+2=-1,1.5+2.5=4这三组数据。
def test_add(a,b,sum): # 需要传入a,b,sum三个参数
res = requests.get(f'add/?a={a}&b={b}')
assert res.text == sum
data = [[1, 2, 3], [-1, 2, -1] ,[1.5, 2.5, 4]]
完整代码如下:
import requests
import pytest
data = [[1, 2, 3], [-1, 2, 1]
@pytest.mark.parametrize('a, b, sum', data)
def test_add(a,b,sum): # 需要传入a,b,sum三个参数
res = requests.get(f'/add/?a={a}&b={b}')
assert res.text == str(sum)
输出:
plugins: base-url-1.4.1, check-0.3.5, html-1.22.0, metadata-1.8.0
collected 2 items
test_aaa.py::test_add[1-2-3] PASSED
test_aaa.py::test_add[-1-2-1] PASSED