当前位置: 首页 > 知识库问答 >
问题:

单元测试与pytest

施兴言
2023-03-14

在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

对于两个不同的函数,我在不同的文件中(比方说test_this.py)将这个输入1和输入2输入到我的函数中。以下是基于上述信息的问题...

>

  • 因为我不能在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。我如何做到这一点?我知道这不是一个好的做法,我的一个测试依赖于另一个测试,但有解决办法吗?

    提前感谢您的回答。

  • 共有2个答案

    弓嘉纳
    2023-03-14

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

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

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

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

    一个重要的原因也是unittest将保持自由。但是,如果你想使用pytest出于某种原因(bit桶等),有一些工具可以转换你的测试,使代码不那么可读。

    玩得高兴

    赵夕
    2023-03-14

    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_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
       ...
    

    或者,你甚至可以制作夹具工厂,该工厂将在飞行中为你制作夹具。当您只有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)
    
     类似资料:
    • 单元测试 单元测试例子放到自己开发的模块下。 如果依赖了第三方服务端(例如Zookeeper),请手动加入 profile。参考 registry-zookeeper 模块代码。 如果依赖了其它模块要集成测试,请放到 test/test-intergrated 模块中。 如果还依赖了第三方服务端(例如Zookeeper),请放到 test-intergrated-3rd 模块中。 性能测试 关闭了

    • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

    • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

    • 单元测试涉及测试软件应用程序的每个单元或单个组件。这是第一级软件测试。单元测试的目的是验证单元组件的性能。 单元是软件系统的单个可测试部分,并在应用程序软件的开发阶段进行测试。 此测试旨在测试隔离代码的正确性。单元组件是应用程序的单独功能或代码。白盒测试方法用于单元测试,通常由开发人员完成。 在测试级别层次结构中,单元测试是在集成和其他剩余测试级别之前完成的第一级测试。它使用模块进行测试,减少了等

    • 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进

    • 我们从 Hello World 项目入手,增加单元测试功能。 我们新家了一个名为hello-world-test的 Gradle 项目。 环境 Gradle 3.4.1 Spring Boot 1.5.2.RELEASE Thymeleaf 3.0.3.RELEASE Thymeleaf Layout Dialect 2.2.0 Spring Security Test 4.2.2.RELEASE