gpt4 book ai didi

python - pytest : Classes vs plain functions 中的分组测试

转载 作者:太空狗 更新时间:2023-10-29 17:59:08 26 4
gpt4 key购买 nike

我正在使用 pytest 来测试我的应用程序。pytest 支持两种编写测试的方法(据我所知):

  1. 在类里面:

test_feature.py -> class TestFeature -> def test_feature_sanity

  1. 在函数中:

test_feature.py -> def test_feature_sanity

是否需要在一个类中对测试进行分组的方法?是否允许向后移植 unittest 内置模块?您认为哪种方法更好,为什么?

最佳答案

这个答案展示了 pytest 中 TestClass 的两个引人注目的用例:

  • 属于给定类的多个测试方法的联合参数化。
  • 通过子类继承重用测试数据和测试逻辑

属于给定类的多个测试方法的联合参数化。

pytest 参数化装饰器 @pytest.mark.parametrize 可用于使输入可用于一个类中的多个方法。在下面的代码中,输入 param1param2 可用于每个方法 TestGroup.test_oneTestGroup.test_two.

"""test_class_parametrization.py"""
import pytest

@pytest.mark.parametrize(
"param1,param2",
[
("a", "b"),
("c", "d"),
],
)
class TestGroup:
"""A class with common parameters, `param1` and `param2`."""

@pytest.fixture
def fixt(self):
"""This fixture will only be available within the scope of TestGroup"""
return 123

def test_one(self, param1, param2, fixt):
print("\ntest_one", param1, param2, fixt)

def test_two(self, param1, param2):
print("\ntest_two", param1, param2)
$ pytest -s test_class_parametrization.py
================================================================== test session starts ==================================================================
platform linux -- Python 3.8.6, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: /home/jbss
plugins: pylint-0.18.0
collected 4 items

test_class_parametrization.py
test_one a b 123
.
test_one c d 123
.
test_two a b
.
test_two c d
.

=================================================================== 4 passed in 0.01s ===================================================================

通过子类继承重用测试数据和测试逻辑

我将使用来自 another answer 的代码的修改版本演示从 TestClass 继承类属性/方法到 TestSubclass 的有用性:

# in file `test_example.py`
class TestClass:
VAR = 3
DATA = 4

def test_var_positive(self):
assert self.VAR >= 0


class TestSubclass(TestClass):
VAR = 8

def test_var_even(self):
assert self.VAR % 2 == 0

def test_data(self):
assert self.DATA == 4

在此文件上运行 pytest 会导致运行四个 测试:

$ pytest -v test_example.py
=========== test session starts ===========
platform linux -- Python 3.8.2, pytest-5.4.2, py-1.8.1
collected 4 items

test_example.py::TestClass::test_var_positive PASSED
test_example.py::TestSubclass::test_var_positive PASSED
test_example.py::TestSubclass::test_var_even PASSED
test_example.py::TestSubclass::test_data PASSED

在子类中,继承的test_var_positive方法使用更新后的值self.VAR == 8和新定义的test_data运行方法针对继承属性 self.DATA == 4 运行。这种方法和属性继承提供了一种灵活的方式来重用或修改不同组的测试用例之间的共享功能。

关于python - pytest : Classes vs plain functions 中的分组测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com