根据文档,我可以在调用unittest.main
时设置python单元测试的详细级别,例如
unittest.main(verbosity=2)
如何在unittest.TestCase
中访问此信息
发布于 2015-10-01 16:49:52
任何基于打补丁或子类化unittest.TestProgram
的方法的问题是,您必须在启动unittest.TestProgram
之前将补丁安装到位。但如果您的测试用例是通过discovery运行的,那么这是不可能的:
python -m unittest discover -v
在发现的情况下,一种有效的方法是使用inspect
模块向上搜索堆栈,直到找到unittest.TestProgram
上的方法:
import inspect
import unittest
def unittest_verbosity():
"""Return the verbosity setting of the currently running unittest
program, or 0 if none is running.
"""
frame = inspect.currentframe()
while frame:
self = frame.f_locals.get('self')
if isinstance(self, unittest.TestProgram):
return self.verbosity
frame = frame.f_back
return 0
发布于 2012-12-07 20:43:26
实现这一点的一种方法是在文件中创建unittest.TestCase
和unittest.main
的子类。在这里,您定义了一个变量(例如globalverb
),该变量可以全局使用,也可以作为类或单例使用,然后覆盖unittest.main
def main(*args, **kwargs):
# parse arguments etc to get the verbosity number or whatever
# ...
# set this number to the defined class
globalverb = verbose_number
return unittest.main(*args, **kwargs)
稍后,您将继承unittest.TestCase
的子类
class MyTestCase(unittest.TestCase):
def my_special_function(self):
if globalverb ...
通过这种方法,可以在(派生的) TestCase中使用详细、详细或任何其他数字和信息,这些信息来自传递给单元测试的参数。
欢迎评论。
发布于 2016-03-10 23:55:41
我的解决方案完全不同。我利用了所有测试都是通过特制的启动脚本触发的优势,而不是使用monkeypatching。它收集了各种配置变量和设置环境,所以只需添加一个额外的导出就非常简单了。
对于更一般的情况,创建test-runner.sh (或其他任何文件)进行完全相同的shell调用,但添加额外的export前缀,这可能是一个明智的解决方案,而不是直接运行测试。
因为一张图片胜过千言万语:
这是我的测试跑步器:
#!/usr/bin/env bash
VERBOSE=false
while getopts ":vt:" opt; do
case $opt in
t)
TEST_TO_RUN=$OPTARG
;;
v)
VERBOSE=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
ENVS=""
ENVS+=" PYTHONPATH=$PYTHONPATH:$PWD"
PARAMS=""
PARAMS+=" -s --nologcapture --with-id"
PARAMS+=" --cov-config=.apirc --cov-report html --with-cov"
SERVER_PRIMER="coverage run --rcfile=.apirc"
if [[ ! -z "$TEST_TO_RUN" ]]; then
PARAMS+=" $TEST_TO_RUN"
fi
if [[ "$VERBOSE" = true ]]; then
PARAMS+=" -v"
ENVS+=" TEST_VERBOSITY=2"
fi
eval "$ENVS nosetests $PARAMS"
RESULT_TEST=$?
然后我在单元测试中使用了这个方法:
@property
def verbosity(self):
return int(os.environ.get('TEST_VERBOSITY', 0))
https://stackoverflow.com/questions/13761697
复制相似问题