单元测试时是否存在一个常数,但是否则为假?

时间:2017-09-11 14:04:30

标签: python python-unittest

在Python的typing模块中,它们有一个非常有用的常量,在类型检查时为True,否则为False。这意味着,例如,如果TYPE_CHECKING评估为True,您可以动态导入类。

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from module import Class

如果unittest有类似的东西,那将非常有用。我可以在__init__.py文件中看到,存在一个定义为__unittest = True的变量:

__all__ = ['TestResult', 'TestCase', 'TestSuite',
           'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
           'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless',
           'expectedFailure', 'TextTestResult', 'installHandler',

__unittest = True

有没有办法像__unittest TYPE_CHECKING一样使用typing

原因:我的代码库中有一些用户示例可以运行并绘制图表。我想将这些示例作为单元测试的一部分来运行,以查看它们何时中断并需要修复。但是,我需要一种动态的方法来停止尝试打开绘图窗口并阻止单元测试的示例。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

  

原因:我的代码库中有一些用户示例可以运行并绘制图表。我想将这些示例作为单元测试的一部分来运行,以查看它们何时中断并需要修复。但是,我需要一种动态的方法来停止尝试打开绘图窗口并阻止单元测试的示例。

实现这一目标的最佳方法是mocking。这将取代一些"模拟"功能。这通常用于"绘制代码"或代码,使"请求"等等。因为您可以禁用测试时不需要/想要的某些功能。

它还避免了与单元测试相关的东西混乱的生产代码。对于类型检查,这是必需的,因为这在运行时发生,但是单元测试通常不会在运行时发生,或者应该在运行时产生任何影响。

你还没有说过你使用了什么样的阴谋,但是如果它matplotlib他们确实有some documentation to facilitate testing或者看到QA

答案 1 :(得分:1)

要检查您的要求(似乎已导入unittest),您可以检查密钥"unittest"是否在sys.modules

import sys
import unittest

if "unittest" in sys.modules:
    print("I'm unittest-ing")

答案 2 :(得分:0)

对于这种情况,我建议使用命令行参数来控制代码是否运行。

在这种情况下,您可以使用一个简单的模块,根据is_unit_testing参数是否已传递给python进程来定义类似-unittest的值。

要处理命令行参数,请查看此处:How do I access command line arguments in Python?

import sys
# sys.argv is a list of all commandline arguments you can check through
command_line_arguments_list = sys.argv # e.g. ["arg1", "arg2", "-unittest"]
is_unit_testing = "-unittest" in command_line_arguments_list

然后,您可以通过命令行传递参数:

python myModule.py  arg1  arg2  -unittest

这适用于任何类似的地方,你需要来自相同代码库的多个“构建”。比如拥有'无数据库'/'无gui'模式等。