在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中定义了许多不同的灯具,并在test_this.py的五个不同函数中使用它们作为函数参数听起来很痛苦,我宁愿回到unittest类结构,定义我的变量,挑选我想要的东西
-
我应该在test_this.py中声明全局变量,并按照我想要的方式在函数中使用它们吗?似乎有点不是pythonic . 此变量仅由此文件中的函数使用 .
-
假设我也有test_that.py和test_them.py . 如果我在这些不同的文件之间有一些共享变量,我将如何声明它们?只需在所有这些测试文件所在的目录中创建一个文件calle variables.py,并在需要时进行导入?这样我就可以将所有数据保持在一个单独的位置 .
-
我的印象是pytest不鼓励使用类来组织你的功能吗?我在网上看到的每一个例子,似乎都只使用了一大堆功能 . 什么是定义类和方法的配置,并在pytest中组织测试?
-
我有一个测试场景,我必须将一个函数的结果用于另一个函数 . 使用pytest,我有一个断言,它位于函数的末尾而不是返回,所以我将无法将此函数用作夹具 . 我该如何做到这一点?我知道这不是一个好的做法,我的一个测试依赖于另一个,但是有一个解决方法吗?
提前感谢您的回答 .
2 回答
1)首先,您不仅可以在conftest.py中声明这些灯具,而且可以在您想要的每个python模块中声明这些灯具 . 您可以导入该模块 . 您也可以使用与使用setUp方法相同的方式使用灯具:
或者您可以在单独的灯具中定义单独的变量:
或者制作一个返回所有变量的夹具(为什么不?),甚至制作间接参数化夹具,根据您的选择返回变量(非常混乱):
或者甚至你可以制作夹具工厂,它将为你动态制作灯具 . 当你只有5个测试和5个变量配置时,听起来很奇怪,但当你得到数百个变量时,它会很有用 .
3)您可以使用cource . 但我建议您不要直接导入此文件,而是使用命令行选项指向要导入的文件 . 在这种情况下,您可以在不更改代码的情况下使用变量共享另一个文件 .
4)我在测试中使用类,因为我从nosetest迁移 . 我没有提到在pytest中使用类的任何问题 .
5)在这种情况下,我建议你做以下事情:用所需的动作完成功能:
然后在测试和夹具中使用它:
我认为unittest更容易阅读 . 对于新测试者来说,unittest非常简单 . 它开箱即用 . 您依赖于Python实现,但它们不会改变未来几年的界面 .
我喜欢以这样的方式组织我的测试,即每个文件最多只有1个测试 . 在那种情况下,我不依赖于类......但是我从每个测试中导入类来做东西 .
一些网站抱怨单元测试中的颜色是不可能的 . 我认为这是一个笑话,因为我的单元测试为Jenkins和其他人创建了JUNIT输出报告 . 有很棒的工具(甚至是1个文件)可以将JUNIT转换为网站,这不是测试工具的责任 .
此外,有些人抱怨你需要很多代码来开始单元测试 . 我不同意,需要4行代码才能创建单元测试!但Pytest需要知道所有困难的注释,这对于简单的Python开发人员来说并不正常 .
一个重要的原因是unittest将保持免费 . 然而,如果你想出于某些原因使用pytest(bitbucket等),有一些工具可以转换你的测试并使代码的可读性降低 .
玩得开心!