![](/img/trans.png)
[英]How to run all TestModule in [Test Setup for Test Modules] CANoe
[英]Run python test modules independtly
我有兩個不同的模塊(test_a.py,test_b.py),其中在一個唯一的文件夾(tests_folder)下使用unittest.Tescase編寫了測試。 如果我使用以下命令運行每個模塊的測試:
python -m unittest tests_folder.test_a.py
python -m unittest tests_folder.test_b.py
它們全部通過,但是如果我運行命令:
python -m unittest discover tests_folder
測試失敗。 我知道這是由於模擬而發生的,因為我正在模擬一個模塊中的某些類,而這些類是在另一個模塊中導入的,這使得模擬不起作用。 因此,我需要完全獨立地運行模塊。 有什么辦法嗎? 謝謝!!
編輯:我准備了一個小項目進行測試。 與下一個文件夾:
project/
├── __init__.py
├── src
│ ├── class_A.py
│ ├── class_B.py
│ ├── class_C.py
│ └── __init__.py
└── tests
├── __init__.py
├── test_1_class_B.py
└── test_2_class_C.py
其中class_B
導入class_A
和class_C
導入class_A
和class_B
。 所有類都是空的,測試僅運行__init__
方法。 我在每個模塊的開頭添加了一條打印消息,以檢查何時輸入了每個模塊。
當我運行python -m unittest discover -v project.tests
我有以下打印內容:
Tests for B
Module B
Module A
Tests for C
因此,這意味着如果在test_2_class_C
模擬class_B.B
則該效果不會生效,因為它已在B的測試中導入,並且不會再次導入。 如果它們獨立運行,則將導致所有測試通過,但它們將因Discover命令而失敗。
模擬的棘手部分(調用patch()
)是使用正確的目標。
可以使用以下代碼在test_2_class_c.py
模擬B
類。
# src/class_a.py
print("Module A")
class A:
def __init__(self):
print(self.a())
def a(self):
return "A"
# src/class_b.py
from src.class_a import A
print("Module B")
class B:
def __init__(self):
A()
print(self.b())
def b(self):
return "B"
# src/class_c.py
from src.class_a import A
from src.class_b import B
class C:
def __init__(self):
A()
B()
print("C")
測試。
# tests/test_1_class_b.py
import unittest
from src.class_b import B
print("Tests for B")
class ClassBTestCase(unittest.TestCase):
def test_b(self):
print()
B()
# tests/test_2_class_c.py
import unittest
from unittest.mock import patch
from src.class_c import C
print("Tests for C")
class ClassCTestCase(unittest.TestCase):
def test_c(self):
print()
C()
@patch("src.class_c.A.a")
@patch("src.class_c.B.b")
def test_c_mock_a_b(self, mock_b, mock_a):
print()
mock_a.return_value = "X"
mock_b.return_value = "Y"
C()
輸出。
$ python -m unittest discover -v tests
Module A
Module B
Tests for B
Tests for C
test_b (test_1_class_b.ClassBTestCase) ...
A
B
ok
test_c (test_2_class_c.ClassCTestCase) ...
A
A
B
C
ok
test_c_mock_a_b (test_2_class_c.ClassCTestCase) ...
X
X
Y
C
ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
這些不是真正的測試(因為沒有斷言),但是打印輸出顯示可以進行模擬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.