单元测试Vs的pytest

问题描述 投票:27回答:2

在单元测试,我可以在一个班级设置变量,那么这个类的方法可以选择任何一个变量,它希望使用...

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

因此,在单元测试,很容易把一些测试在一起,可能有类去下,然后使用许多不同的变量(内翻varB)为不同的方法。在pytest,我创建了conftest.py夹具,而不是在单元测试类,像这样...

@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

我喂这个输入1和输入2到我的功能在不同的文件(让我们说test_this.py)两个不同的功能。下面是根据上述信息的问题...

  1. 因为我不能只在conftest.py声明局部变量,因为我不能简单地导入此文件。是否有此声明不同的变量,可以在不同的功能test_this.py使用的更好的办法?我有我的这些变量的实际检测五种不同的配置,定义在conftest.py许多不同的灯具,并利用它们作为函数的参数在五个不同功能test_this.py声音痛苦,我宁愿回去单元测试类结构,定义我的变量和挑选我想要什么
  2. 如果我只是在test_this.py声明全局变量和函数使用他们,我想要的方式?似乎有点不符合Python。这个变量只使用此文件中的函数。
  3. 比方说,我有test_that.py和test_them.py为好。如果我有这些不同的文件之间的一些共享变量,我将如何申报呢?只是创建在所有这些测试文件并执行目录中的文件卡莱variables.py每当我需要进口?这样我可以保持在一个单独的所有数据。
  4. 是不是我的印象是pytest鼓励使用类来组织你的功能呢?我看了网上的每个例子中,这一切似乎聘请一堆只灯具的功能。什么是pytest定义类和方法,并组织测试的配置?
  5. 我有一个测试场景,我必须用一个函数的结果到另一个。随着pytest,我有一个断言,在一个函数不返回的结束,所以我将无法使用该功能作为夹具。如何做到这一点?我知道这是不是一个好的做法,我的一个测试依赖于别人,但有一个变通?

在此先感谢您的回答。

python pytest unit-testing
2个回答
25
投票

1)首先你可以声明这些灯具不仅在conftest.py,但你希望每一个Python模块。你可以导入模块。另外,作为您使用的设置方法,你可以使用固定装置以同样的方式:

@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

或者你可以定义不同的灯具单独的变量:

def fixture_a():
    return varA

def fixture_b():
    return varB

def fixture_c():
    return varC

def fixture_mod_A():
    return modified_varA

或使一个夹具返回所有的变量(为什么不呢?),甚至使间接参数化夹具由你选择(相当混乱的方式)返回变量:

@pytest.fixture()
def parametrized_iput(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_iput', [('varA', 'varC')], indirect=True)
def test_1(parametrized_iput)
   varA, varC = parametrized_iput
   ...

甚至可以使灯具的工厂,这将使灯具为你的飞行。听起来奇怪,当你只有5次测试和变量5点的配置,但是当你得到数百双方的,也可以是有用的。

3)五言你可以。不过我建议你不要直接导入此文件,但使用命令行选项指向导入哪些文件。在这种情况下,你可以用cohoose变量另一个文件而无需修改代码。

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

5)在这种情况下,我建议你做到以下几点:拳头做出与所需的操作功能:

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

然后用它无论是在测试和夹具:

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

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

1
投票

我觉得单元测试更容易阅读。对于新的测试,单元测试是很容易的。这是工作的开箱。你依赖于Python实现,但他们不会改变接口未来几年。

我喜欢我的组织测试,以这样的方式,我有每个文件最大1次测试。在这种情况下,我不依赖于类......但我导入类从每一个测试做的东西。

有些网站抱怨颜色的单元测试是不可能的。我认为这是一个笑话,因为我的单元测试创​​建詹金斯和其他JUNIT输出报告。有伟大的工具(甚至1个文件)JUnit的转换到一个网站,这不是一个测试工具的责任。

此外,一些人抱怨,你需要大量的代码来启动一个单元测试。我不同意,它需要4行代码来创建单元测试!但Pytest需要知道所有的困难注解,这是不正常的一个简单的Python开发。

一个重要的原因还在于,单元测试将保持自由。但是,如果你想使用pytest出于某种原因(到位桶等),也有工具来转换您的测试,使代码的可读性。

玩得开心!

© www.soinside.com 2019 - 2024. All rights reserved.