我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。
目录
在大项目中,会有很多的fixture,这时候你可能需要覆盖一个全局或者根目录下的fixture,以保持局部fixture测试代码的可读性和可维护性.
1.通过局部conftest.py覆盖全局fixture
1.1介绍
在项目运行做,我们根目录下的conftest.py文件会定义一些fixture,但我们有的时候可能用不上,或者我们需要获取返回值在重新包装一下,这时候我们可以在新建一个目录,在此目录下在编写一个conftest.py来完成我们要的二次封装.
1.2示例代码
文件结构:
tests
conftest.py
import pytest
@pytest.fixture
def username():
return 'username'
test_something.py
def test_username(username):
assert username == 'username'
subfolder/
conftest.py
import pytest
@pytest.fixture
def username(username):
return 'overridden-' + username
test_something.py
def test_username(username):
assert username == 'overridden-username'
1.3运行结果
1.4分析结果
可以看到我们的断言是成功的,所以我们的覆盖起了效果,不然在subfolder\test_something.py::test_username就会断言失败.
2.通过模块fixture覆盖全局fixtrue
2.1介绍
我们可以在当前测试模块中定义同名fixture函数去覆盖全局的fixture
2.2实例代码
文件结构:
tests/
conftest.py
import pytest
@pytest.fixture
def username():
return 'username'
test_something.py
import pytest
@pytest.fixture
def username(username):
return 'overridden-' + username
def test_username(username):
assert username == 'overridden-username'
2.3运行结果
2.4结果分析
断言成功,说明我们的模块fixture成功的覆盖了全局fixtrue.
3.使用测试参数化覆盖全局fixture
3.1介绍
我们可以通过@pytest.mark.parametrize()参数化,来实现覆盖全局fixture
3.2示例代码
文件结构:
tests/
conftest.py
import pytest
@pytest.fixture
def username():
return 'username'
test_something.py
import pytest
@pytest.fixture
def username(username):
return 'overridden-' + username
@pytest.mark.parametrize('username', ['weiguang'])
def test_username(username):
assert username == 'weiguang'
3.3测试结果
3.4结果分析
断言成功了,说明参数化覆盖了全局fixture和模块fixture,因为如果没有覆盖的话,断言内容就是’overridden-username’ == 'weiguang’所以会断言失败.既然断言成功说明我们的断言内容就是"weiguang" == "weiguang"所以断言成功.
4.外部引入的fixture覆盖全局fixture
4.1介绍
前面我们讲了fixture的模块化,这里我们同样可以用引入的fixtrue去覆盖全局的fixture
4.2示例代码
文件结构:
tests/
conftest.py
import pytest
@pytest.fixture
def username():
return 'username'
fixtures/
username.py
import pytest
@pytest.fixture
def username():
return 'fixtures/username'
test_demo.py
from tests.fixtures.username import username
def test_demo(username):
assert username == "fixtures/username"
4.3运行结果
4.4结果分析
断言成功,说明我们外部引入的fixture覆盖了全局的fixture,因为username返回的是"fixtures/username"才会断言成功
5.非参数化的fixture覆盖参数化的fixture(反之亦然)
5.1介绍
有时候我们全局的fixture是参数化的,但我们不想让他参数化,那我们就本地使用未参数化的fixture去覆盖它
5.2示例代码
文件结构:
tests/
conftest.py
import pytest
@pytest.fixture(params=['one', 'two', 'three'])
def parametrized_username(request):
return request.param
test_demo.py
import pytest
@pytest.fixture
def parametrized_username():
return 'overridden-username'
def test_demo(parametrized_username):
assert parametrized_username == "overridden-username"
5.3运行结果
5.4分析结果
可以看到我们断言成功了,且只执行了一次,说明我们本地的fixture覆盖了全局的fixture,参数化的fixture被本地非参数化的fixture覆盖了.同样的,如果本地是参数化的fixtrue也会覆盖全局非参数化的fixture