簡體   English   中英

獨立運行python測試模塊

[英]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_Aclass_C導入class_Aclass_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM