我有一个包含多个程序的存储库:
.
└── Programs
├── program1
│ └── Generic_named.py
└── program2
└── Generic_named.py
我想向此存储库添加测试。
我尝试这样做:
.
├── Programs
│ ├── program1
│ │ └── Generic_named.py
│ └── program2
│ └── Generic_named.py
└── Tests
├── mock
│ ├── 1
│ │ └── custom_module.py
│ └── 2
│ └── custom_module.py
├── temp
├── test1.py
└── test2.py
其中
temp
是临时存储每个程序的文件夹,其中包含无法直接与程序一起存储的任何所需导入的模拟版本。
假设我们使用这样的 hello world 示例:
cat Programs/program1/Generic_named.py
import custom_module
def main():
return custom_module.out()
cat Programs/program2/Generic_named.py
import custom_module
def main():
return custom_module.out("Goodbye, World!")
cat Tests/mock/1/custom_module.py
def out():return "Hello, World!"
cat Tests/mock/2/custom_module.py
def out(x):return x
我将使用这些脚本来测试它:
cat Tests/test1.py
import unittest
import os
import sys
import shutil
if os.path.exists('Tests/temp/1'):
shutil.rmtree('Tests/temp/1')
shutil.copytree('Tests/mock/1', 'Tests/temp/1/')
shutil.copyfile('Programs/program1/Generic_named.py', 'Tests/temp/1/Generic_named.py')
sys.path.append('Tests/temp/1')
import Generic_named
sys.path.remove('Tests/temp/1')
class Test(unittest.TestCase):
def test_case1(self):
self.assertEqual(Generic_named.main(), "Hello, World!")
if __name__ == '__main__':
unittest.main()
cat Tests/test2.py
import unittest
import os
import sys
import shutil
if os.path.exists('Tests/temp/2'):
shutil.rmtree('Tests/temp/2')
shutil.copytree('Tests/mock/2', 'Tests/temp/2')
shutil.copyfile('Programs/program2/Generic_named.py', 'Tests/temp/2/Generic_named.py')
sys.path.append('Tests/temp/2')
import Generic_named
sys.path.remove('Tests/temp/2')
class Test(unittest.TestCase):
def test_case1(self):
self.assertEqual(Generic_named.main(), "Goodbye, World!")
if __name__ == '__main__':
unittest.main()
单独运行时,两个测试都通过:
python3 -m unittest Tests/test1.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
python3 -m unittest Tests/test2.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
但是,它们一起运行时会失败:
python3 -m unittest discover -p test*.py -s Tests/
.F
======================================================================
FAIL: test_case1 (test2.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/s/Documents/Coding practice/2024/Test Mess/1/Tests/test2.py", line 18, in test_case1
self.assertEqual(Generic_named.main(), "Goodbye, World!")
AssertionError: 'Hello, World!' != 'Goodbye, World!'
- Hello, World!
+ Goodbye, World!
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
如果我尝试对我要测试的脚本之一使用不同的临时名称,
cat Tests/test2.py
import unittest
import os
import sys
import shutil
if os.path.exists('Tests/temp/2'):
shutil.rmtree('Tests/temp/2')
shutil.copytree('Tests/mock/2', 'Tests/temp/2')
shutil.copyfile('Programs/program2/Generic_named.py', 'Tests/temp/2/Generic_named1.py')
sys.path.append('Tests/temp/2')
import Generic_named1
sys.path.remove('Tests/temp/2')
class Test(unittest.TestCase):
def test_case1(self):
self.assertEqual(Generic_named1.main(), "Goodbye, World!")
if __name__ == '__main__':
unittest.main()
然后我得到一个不同的错误:
python3 -m unittest discover -p test*.py -s Tests/
.E
======================================================================
ERROR: test_case1 (test2.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/s/Documents/Coding practice/2024/Test Mess/2/Tests/test2.py", line 18, in test_case1
self.assertEqual(Generic_named1.main(), "Goodbye, World!")
File "/home/s/Documents/Coding practice/2024/Test Mess/2/Tests/temp/2/Generic_named1.py", line 4, in main
return custom_module.out("Goodbye, World!")
TypeError: out() takes 0 positional arguments but 1 was given
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (errors=1)
它似乎正在尝试导入相同的文件,尽管我使用来自不同路径的同名不同文件。这看起来很奇怪,因为在导入我想要测试的内容后,我一直确保撤消对 Python 路径的任何更改。有什么办法可以模拟路径吗?我无法更改
custom_module
的名称,因为这需要更改我想要测试的程序。
我应该如何编写、处理或设置这些测试,以便可以使用 unittest 进行测试,发现它们与单独测试相同?
mock/2/custom_module.py
更改
program2/Generic_named.py
的名称后 ---> program2/Generic_named1.py
,我建议您也将(如果可以的话)模块的名称mock/2/custom_module.py
重命名为mock/2/custom_module1.py
。
Generic_name1.py
之后,您还必须修改
Generic_name1.py
中的导入,使该文件变为:
import custom_module1
def main():
return custom_module1.out("Goodbye, World!")
通过这种方式,通过命令
python3 -m unittest discover -p test*.py -s Tests/
执行测试会成功,如下面的输出所示:
python -m unittest discover -p test*.py -s Tests/
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK