首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何访问unittest.TestCase中的unittest.main(详细)设置

如何访问unittest.TestCase中的unittest.main(详细)设置
EN

Stack Overflow用户
提问于 2012-12-07 18:57:20
回答 7查看 7.2K关注 0票数 22

根据文档,我可以在调用unittest.main时设置python单元测试的详细级别,例如

代码语言:javascript
复制
unittest.main(verbosity=2)

如何在unittest.TestCase中访问此信息

EN

回答 7

Stack Overflow用户

发布于 2015-10-01 16:49:52

任何基于打补丁或子类化unittest.TestProgram的方法的问题是,您必须在启动unittest.TestProgram之前将补丁安装到位。但如果您的测试用例是通过discovery运行的,那么这是不可能的:

代码语言:javascript
复制
python -m unittest discover -v

在发现的情况下,一种有效的方法是使用inspect模块向上搜索堆栈,直到找到unittest.TestProgram上的方法:

代码语言:javascript
复制
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
票数 8
EN

Stack Overflow用户

发布于 2012-12-07 20:43:26

实现这一点的一种方法是在文件中创建unittest.TestCaseunittest.main的子类。在这里,您定义了一个变量(例如globalverb),该变量可以全局使用,也可以作为类或单例使用,然后覆盖unittest.main

代码语言:javascript
复制
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的子类

代码语言:javascript
复制
class MyTestCase(unittest.TestCase):
    def my_special_function(self):
        if globalverb ...

通过这种方法,可以在(派生的) TestCase中使用详细、详细或任何其他数字和信息,这些信息来自传递给单元测试的参数。

欢迎评论。

票数 4
EN

Stack Overflow用户

发布于 2016-03-10 23:55:41

我的解决方案完全不同。我利用了所有测试都是通过特制的启动脚本触发的优势,而不是使用monkeypatching。它收集了各种配置变量和设置环境,所以只需添加一个额外的导出就非常简单了。

对于更一般的情况,创建test-runner.sh (或其他任何文件)进行完全相同的shell调用,但添加额外的export前缀,这可能是一个明智的解决方案,而不是直接运行测试。

因为一张图片胜过千言万语:

这是我的测试跑步器:

代码语言:javascript
复制
#!/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=$?

然后我在单元测试中使用了这个方法:

代码语言:javascript
复制
@property
def verbosity(self):
    return int(os.environ.get('TEST_VERBOSITY', 0))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13761697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档