小编Luc*_*arr的帖子

unittest vs pytest

在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
Run Code Online (Sandbox Code Playgroud)

所以在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
Run Code Online (Sandbox Code Playgroud)

我将这个input1和input2作为两个不同的函数提供给我的函数在另一个文件中(比如说test_this.py).以下是基于以上信息的问题......

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

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

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

  4. 我的印象是pytest不鼓励使用类来组织你的功能吗?我在网上看到的每一个例子,似乎都只使用了一大堆功能.什么是定义类和方法的配置,并在pytest中组织测试?

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

提前感谢您的回答.

python unit-testing pytest

39
推荐指数
2
解决办法
4万
查看次数

pytest 以及为什么避免初始化文件

曾几何时,pytest 文档现在位于https://docs.pytest.org/en/latest/goodpractices.html的 pytest 文档曾经说过:

\n\n
\n

__init__.py避免测试目录中的\xe2\x80\x9c \xe2\x80\x9d 文件。这样您的测试就可以轻松地针对已安装的版本运行mypkg,无论安装的包是否包含测试,都独立于该包。

\n
\n\n

我不明白以下引用:

\n\n
    \n
  1. 安装版本是什么意思mypkg?如果我有一个简单的 Flask 应用程序,当您在本地主机上点击根目录时仅显示“hello world”,我如何关联安装应用程序?
  2. \n
  3. 安装版本与安装包有何不同?
  4. \n
  5. “如果包含测试或不包含测试”是什么意思?与测试发现有关吗?
  6. \n
  7. 有人可以实际解释如何没有__init__.py是好的吗?
  8. \n
\n

python pytest

4
推荐指数
1
解决办法
3112
查看次数

使用装饰器的动态方法创建者的python setattr

我有一个定义了多个方法的类。

import mat
class Klass(object):

    @mat.sell(mat.CanSet):
    def method1(self):
        return None

    @mat.sell(mat.CanSet):
    def method2(self):
        return 'value2'
Run Code Online (Sandbox Code Playgroud)

假设我有10种方法需要填充此“ Klass”。我想生成这些方法而不显式地编写它们。所以我想做一个为每种方法做setattr的工厂。问题是我遵循以下方法,并且last方法具有最后一个值。每个都没有获得其相关的值,而是value10。另外下面的解决方案没有实现装饰器,我不知道如何分配装饰器

class Klass(object):
    pass

list1 = [('method1', 'value1'), ('method2', 'value2').....('method10', 'value10')]

for each in list1:
    method_name, method_value = each
    setattr(Klass, method_name, lambda self: method_value)
Run Code Online (Sandbox Code Playgroud)

所以当我跟随时...

k = Klass()
print k.method1(), method2()...., method10()
Run Code Online (Sandbox Code Playgroud)

每种方法的结果均为value10。不明白为什么 ?另外,任何人都可以帮助您实现具有一个属性的装饰器吗?附言:如果您有建议不要使用“ setattr”,那也将受到欢迎。

python factory decorator setattr python-decorators

2
推荐指数
2
解决办法
1646
查看次数