gpt4 book ai didi

python - 如何正确导入测试类以从中继承,而不将其作为测试运行

转载 作者:行者123 更新时间:2023-12-04 16:45:08 25 4
gpt4 key购买 nike

语境
我有一个测试类,我的所有测试都继承自该类。它不能自己运行,因为它真的不包含任何设置信息
我想添加一个由所有测试执行的测试(将它添加到基类似乎合乎逻辑)
但是现在我注意到我导入的 basetestclass( => Foo) 被检测为测试本身并运行并且在报告中可见
代码
base.py 中的基类

from unittest import TestCase

class Foo(TestCase):
@classmethod
def setUpClass(cls):
# prepare the generic setup stuff based on what is defined in the child class
print("setupclass Foo done")

def test_run_in_all_inherited_tests(self):
print("fooBar")
assert True
test_something.py 中的真正测试
from base import Foo # <= This is being detected as a testclass object and thus will be executed

class TestFoo(Foo):
@classmethod
def setUpClass(cls):
# define specific test setup
super().setUpClass()
print("setup TestFoo done")

def test_pass(self):
pass

def test_assert(self):
assert False
这会触发对导入的 Foo 的测试运行
pycharm testrun
问题
如何在不将其检测为“测试”的情况下导入 Foo
如果我删除测试以在所有测试中运行,一切都很好。
添加 @nottest从那时起,Foo 的装饰器就不起作用了,所有继承的类都被定义为 nottest。
它需要在 nose 上运行, pytestunittest测试者
我注意到如果我像下面这样更改导入语句,它也可以工作。但这意味着在不同的存储库中调整数百个测试文件。 (我想避免这种情况)
import base
class TestFoo(base.Foo):

最佳答案

答案的关键似乎是每个测试都有一个属性__test__设置为 True考试的时候。
将其设置为 False当这个类不应该是一个测试时,就会让测试收集器忽略这个类。
答案假设我只能在 base.py 中进行更改
在 python 3.9 中,类方法和属性装饰器可以结合使用,所以我为此写了一个单独的答案
< py3.9 的答案
base.py 中的基类

from unittest import TestCase

class MetaFoo(type):
@property
def __test__(cls):
return cls != Foo

class Foo(TestCase, metaclass=MetaFoo):
@classmethod
def setUpClass(cls):
# prepare the generic setup stuff based on what is defined in the child class
print("setupclass Foo done")

def test_run_in_all_inherited_tests(self):
print("fooBar")
assert True
回答 >= py3.9
base.py 中的基类
from unittest import TestCase

class Foo(TestCase):
@classmethod
@property
def __test__(cls):
return cls != Foo

@classmethod
def setUpClass(cls):
# prepare the generic setup stuff based on what is defined in the child class
print("setupclass Foo done")

def test_run_in_all_inherited_tests(self):
print("fooBar")
assert True
实际测试
test_something.py
from base import Foo # <= This will not be detected as a test anymore as __test__ returns False

class TestFoo(Foo):
@classmethod
def setUpClass(cls):
# define specific test setup
super().setUpClass()
print("setup TestFoo done")

def test_pass(self):
pass

def test_assert(self):
assert False
这不再触发导入的 Foo 的测试运行
pycharm test run

关于python - 如何正确导入测试类以从中继承,而不将其作为测试运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69091760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com