Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试与pytest_Python_Pytest_Unit Testing - Fatal编程技术网

Python 单元测试与pytest

Python 单元测试与pytest,python,pytest,unit-testing,Python,Pytest,Unit Testing,在unittest中,我可以在一个类中设置变量,然后这个类的方法可以选择它想要使用的变量 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_somethin

在unittest中,我可以在一个类中设置变量,然后这个类的方法可以选择它想要使用的变量

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中,很容易将一组测试放在一起,这些测试可以放在一个类下,然后为不同的方法使用许多不同的变量(varA和varB)。在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)中的函数。以下是基于上述信息的问题

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

  • 我是否应该在test_this.py中声明全局变量,并以我想要的方式在函数中使用它们?看起来有点不太像蟒蛇。此变量仅由此文件中的函数使用

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

  • 我的印象是pytest不鼓励使用类来组织函数吗?我在网上读到的每一个例子,似乎都只使用了一堆带有固定装置的函数。在pytest中定义类和方法并组织测试的配置是什么

  • 我有一个测试场景,其中我必须将一个函数的结果用于另一个函数。在pytest中,我有一个位于函数末尾的断言,而不是返回,因此我不能将此函数用作fixture。我如何做到这一点?我知道这不是一个好的做法,我的一个测试依赖于另一个测试,但有解决办法吗

  • 首先,您不仅可以在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
    
    或者制作一个返回所有变量的装置(为什么不?) 或者甚至制作间接参数化夹具,由您选择返回变量(相当混乱的方式):

    或者,你甚至可以制作夹具工厂,该工厂将在飞行中为你制作夹具。当您只有5个测试和5个变量配置时,听起来很奇怪,但是当您同时拥有数百个测试和变量配置时,它可能会很有用

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

    4) 我在测试中使用类,因为我是从NoTest迁移来的。我没有提到在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)
    

    我认为单元测试更容易阅读。对于新的测试人员来说,unittest非常简单。它是开箱即用的。您依赖于Python实现,但它们在未来几年内不会改变接口

    我喜欢以这样的方式组织我的测试,即每个文件最多有1个测试。在这种情况下,我不依赖于类。。。但是我从每个测试中导入类来做一些事情

    一些网站抱怨unittest中的颜色是不可能的。我认为这是一个笑话,因为我的单元测试为Jenkins和其他人创建JUNIT输出报告。有很好的工具(甚至1个文件)可以将JUNIT转换为网站,这不是测试工具的责任

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


    另一个重要原因是unittest将保持免费。但是,如果出于某种原因(bitbucket等)希望使用pytest,则有一些工具可以转换测试并降低代码的可读性


    玩得开心

    谢谢,这对我从unittest迁移到py.test有很大帮助。不过有一点值得注意:我认为不应该使用
    @pytest.usefixtures
    @pytest.mark.usefixtures
    。“另一个重要原因是unittest将保持免费。但是,如果您出于某种原因(bitbucket等)想使用pytest,则有一些工具可以转换您的测试并降低代码的可读性。”我不知道你在这里是什么意思,你是在暗示pytest不会免费吗?还有,你说的“免费”是什么意思?最后一段让我很困惑,我对unittest唯一的抱怨是,它们使用自定义语法操作,如
    self.assertEqual(some_var,5)
    ,而不是在pytest中使用干净的
    assert some_var==5
    “但是,如果出于某种原因(bitbucket等)想使用pytest”pytest与bitbucket的集成是否比unittest更好?最后一句“使代码不那么可读”有损于其他一些优点。标准库的一部分总是使用包的一个很好的理由,unittest可以在没有大量样板的情况下完成,但是“可读性”是非常主观的。
    def test():
        assert some_actions(1,2) == 10
    
    @pytest.fixture()
    def some_fixture():
         return some_actions(1,2)