背景關系
我有一個測驗類,我的所有測驗都繼承于此。它不能自己運行,因為它真的不包含任何設定資訊。我想添加一個由所有測驗執行的測驗(將其添加到baseclass中似乎是合乎邏輯的)
但現在我注意到,我發現所有的測驗都會被執行。
但是現在我注意到我匯入的 basetestclass( => Foo) 被檢測為一個測驗本身,并且運行,在報告中是可見的
代碼 base.py中的基類from unittest import TestCase
class Foo(TestCase)。
@classmethod.
def setUpClass(cls)。
# 根據子類中定義的內容準備通用設定的東西。
print("setupclass Foo done"/span>)
def test_run_in_all_inherited_tests(self)。
print("fooBar"/span>)
assertTrue
真正的測驗在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)。
# 定義特定的測驗設定。
super().setUpClass()
print("setup TestFoo done"/span>)
def test_pass(self)。
pass。
def test_assert(self)。
assert False
這就觸發了對匯入的Foo的測驗運行
問題所在
我怎樣才能在匯入Foo時不被發現是一個 "測驗"? 如果我洗掉所有測驗中運行的測驗,則一切正常。給Foo添加@nottest裝飾器是行不通的,因為這樣所有的繼承類都被定義為非test。
它需要在nose、pytest和unittest測驗程式中運行
我注意到,如果我像下面那樣改變匯入陳述句,它也可以作業。但這意味著要調整不同倉庫中的幾百個測驗檔案。(我想避免這種情況)
import base
class TestFoo(base.Foo)。
uj5u.com熱心網友回復:
答案的關鍵似乎是每個測驗都有一個屬性__test__,當它是一個測驗時被設定為True。
當該類不應該是一個測驗時,將其設定為False將使測驗收集器忽略這個類。
答案是假設我只能在base.py中做修改
在Python 3.9中,classmethod和property decorators可以被結合起來,所以我為此寫了一個單獨的答案。答案為 < py3.9
。base.py中的基類
from unittest import TestCase
class MetaFoo(type)。
@property
def __test__(cls):
return cls != Foo
class Foo(TestCase,metaclass=MetaFoo)。
@classmethod[/span]。
def setUpClass(cls)。
# 根據子類中定義的內容準備通用設定的東西。
print("setupclass Foo done"/span>)
def test_run_in_all_inherited_tests(self)。
print("fooBar"/span>)
assertTrue
答案為>= py3.9
。base.py中的基類
from unittest import TestCase
class Foo(TestCase)。
@classmethod.
@property: @classmethod.
def __test__(cls)。
return cls != Foo
@classmethod[/span]。
def setUpClass(cls)。
# 根據子類中定義的內容準備通用設定的東西。
print("setupclass Foo done"/span>)
def test_run_in_all_inherited_tests(self)。
print("fooBar"/span>)
assertTrue
實際測驗
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)。
# 定義特定的測驗設定。
super().setUpClass()
print("setup TestFoo done"/span>)
def test_pass(self)。
pass。
def test_assert(self)。
assert False
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320071.html
標籤:

