gpt4 book ai didi

python - unittest 与 pytest

转载 作者:IT老高 更新时间:2023-10-28 21:55:37 26 4
gpt4 key购买 nike

在单元测试中,我可以在一个类中setUp变量,然后这个类的方法可以选择它想使用的任何变量...

class test_class(unittest.TestCase):
def setUp(self):
self.varA = 1
self.varB = 2
self.varC = 3
self.modified_varA = 2

def test_1(self):
do_something_with_self.varA, self.varB

def test_2(self):
do_something_with_self_modified_varA, self.varC

所以在 unittest 中,很容易将一堆测试放在一起,这些测试可以放在一个类下,然后为不同的方法使用许多不同的变量(varAvarB) .在 pytest 中,我在 conftest.py 中创建了一个 fixture ,而不是在 unittest 中创建了一个类,就像这样...

@pytest.fixture(scope="module")
def input1():
varA = 1
varB = 2
return varA, varB

@pytest.fixture(scope="module")
def input2():
varA = 2
varC = 3
return varA, varC

我将此 input1 和 input2 提供给我在不同文件(比如说 test_this.py)中的两个不同函数的函数。以下是根据以上信息提出的问题...

  1. 因为我不能只在 conftest.py 中声明局部变量,因为我不能简单地导入这个文件。有没有更好的方法在这里声明不同的变量,可以在 test_this.py 的不同函数中使用?在我对这些变量的实际测试中,我有五种不同的配置,在 conftest.py 中定义了许多不同的 fixture ,并将它们用作 test_this.py 中五个不同函数中的函数参数听起来很痛苦,我宁愿回到 unittest 类结构,定义我的变量并挑选我想要的。

  2. 我应该只在 test_this.py 中声明全局变量,然后按照我想要的方式在函数中使用它们吗?似乎有点不像pythonic。此变量仅供此文件中的函数使用。

  3. 假设我也有 test_that.pytest_them.py。如果我在这些不同的文件之间有一些共享变量,我将如何声明它们?只需在所有这些测试文件所在的目录中创建一个名为 variables.py 的文件,并在需要时进行导入?这样我可以将所有数据单独保存。

  4. 我的印象是 pytest 不鼓励使用类来组织你的函数吗?我在网上阅读的每个示例,似乎都只使用了一些带有固定装置的功能。 pytest中定义类和方法以及组织测试的配置是什么?

  5. 我有一个测试场景,我必须将一个函数的结果用于另一个函数。使用 pytest,我有一个位于函数末尾的断言,而不是返回,因此我将无法将此函数用作固定装置。我该如何做到这一点?我知道我的一个测试依赖于另一个测试不是一个好习惯,但有解决方法吗?

最佳答案

1) 首先,您不仅可以在 conftest.py 中声明这些固定装置,还可以在您想要的每个 Python 模块中声明这些装置。您可以导入该模块。您也可以像使用 setUp 方法一样使用固定装置:

@pytest.fixture(scope='class')
def input(request):
request.cls.varA = 1
request.cls.varB = 2
request.cls.varC = 3
request.cls.modified_varA = 2

@pytest.usefixtures('input')
class TestClass:
def test_1(self):
do_something_with_self.varA, self.varB

def test_2(self):
do_something_with_self_modified_varA, self.varC

或者您可以在单独的 fixture 中定义单独的变量:

def fixture_a():
return varA

def fixture_b():
return varB

def fixture_c():
return varC

def fixture_mod_A():
return modified_varA

或制作一个返回所有变量的 fixture (为什么不呢?)甚至制作间接参数化的 fixture ,它可以根据您的选择返回变量(相当困惑的方式):

@pytest.fixture()
def parametrized_input(request):
vars = {'varA': 1, 'varB': 2, 'varC': 3}
var_names = request.param
return (vars[var_name] for var_name in var_names)

@pytest.mark.parametrize('parametrized_input', [('varA', 'varC')], indirect=True)
def test_1(parametrized_input)
varA, varC = parametrized_input
...

或者您甚至可以制作 fixture 工厂,它会即时为您制作 fixture 。当您只有 5 个测试和 5 个变量配置时听起来很奇怪,但是当您同时拥有数百个时,它会很有用。

3) 当然可以。但我建议您不要直接导入此文件,而是使用命令行选项指向要导入的文件。在这种情况下,您可以在不更改代码的情况下选择另一个带有变量的文件。

4) 我在测试中使用类,因为我是从nosetest 迁移而来的。我没有提到在 pytest 中使用类有任何问题。

5) 在这种情况下,我建议您执行以下操作:首先用所需的 Action 制作函数:

def some_actions(a, b):
# some actions here
...
return c

然后在测试和 fixture 中使用它:

def test():
assert some_actions(1,2) == 10

@pytest.fixture()
def some_fixture():
return some_actions(1,2)

关于python - unittest 与 pytest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954702/

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