我有一个使用Python unittest模块进行单元测试的大型项目。
我有一个控制系统大部分行为的小方法。当在UTs下运行时,我需要这个方法返回固定的结果,以便进行一致的测试运行,但是对于每个单独的UT来说,模拟这个方法会很昂贵。
是否有一种方式可以使这个单独的方法成为unittest感知的,以便在运行unittest时修改其行为?
我有一个使用Python unittest模块进行单元测试的大型项目。
我有一个控制系统大部分行为的小方法。当在UTs下运行时,我需要这个方法返回固定的结果,以便进行一致的测试运行,但是对于每个单独的UT来说,模拟这个方法会很昂贵。
是否有一种方式可以使这个单独的方法成为unittest感知的,以便在运行unittest时修改其行为?
如果要检查unittest
模块是否已加载,只有在运行测试时才应该加载。
>>> 'unittest' in sys.modules.keys()
False
>>> from unittest import TestCase
>>> 'unittest' in sys.modules.keys()
True
.keys()
,直接使用'unittest' in sys.modules
会更有效率。 - Troybehave
或 pytest
运行测试的解决方案。 - Eitel Dagnin我的解决方案是在运行 unittest
前设置一个TEST_FLAG=true
的环境变量。例如:
TEST_FLAG=true python -m unittest discover -s tests -b
MONGODB_URI =
os.environ.get('MONGODB_URI') if not os.environ.get('TEST_FLAG')
else os.environ.get('MONGODB_TEST_URI')
我不太了解 unittest
模块,但如果您正在运行文件进行单元测试,则可以使用以下 if 语句将测试代码封装起来:
if __name__ == "__main__":
unittest.main()
的方式。https://docs.python.org/2/library/unittest.html
这假设你没有从命令行运行。unittest.main()
函数。import inspect
def in_unit_test():
current_stack = inspect.stack()
for stack_frame in current_stack:
for program_line in stack_frame[4]: # This element of the stack frame contains
if "unittest" in program_line: # some contextual program lines
return True
return False
inspect
模块有很多用于内省的实用函数。请参考https://docs.python.org/2/library/inspect.html。True
,因为函数名为in_unittest
,并将由if“unittest”in program_line:
断言。 - EwyynTomato使用 tox
我可以像这样设置环境变量:
[testenv]
setenv = TOX_TESTENV = true
然后在代码中,我检查变量是否已设置:
import os
if os.env.get('TOX_TESTENV'):
# Code is running under test.
# This is useful to configure log levels for example.
def func():
return random.randint()
import module
def replacement_func():
return 4 # chosen by fair dice roll
module.func = replacement_func
# run unit tests here
module
中的代码调用func()
函数,它实际上将会回调到您的replacement_func()
函数。