【问题标题】:Is there a constant that's True when unittesting, but False otherwise?是否有一个常量在单元测试时为真,否则为假?
【发布时间】:2017-09-11 14:04:29
【问题描述】:

在 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

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

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

非常感谢任何帮助!

【问题讨论】:

  • 您到底想检查什么?那个unittest 已经被导入还是别的什么?
  • 只是建议一个非常简单的方法:在单元测试期间向所有需要更改其行为的方法添加**kwargs(这已经是进行单元测试的不好方法,因为您正在更改在某些方面,您的代码中的功能 - 例如,您正在执行的绘图与您的函数中的数据表示不再兼容),因此在您添加到调用的测试中,参数 unittest=True 可能对您来说是一个很好的解决方案?
  • 要检查您要问的内容(似乎unittest 已被导入)您可以检查密钥"unittest" 是否在sys.modules
  • 是的@MatteoRagni!您可以使用'unittest' in sys.modules 来确定是否已导入单元测试。
  • 如果你把它变成一个答案,我会接受它并为你带来荣耀

标签: python python-unittest


【解决方案1】:

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

实现这一目标的最佳方式是通过mocking。这将用一些“模拟”功能替换功能。这通常用于“绘制代码”或发出“请求”之类的代码。因为您可以在测试时禁用某些您不需要/不需要的功能。

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

你还没有说你使用了什么样的绘图,但如果是matplotlib,他们确实有some documentation to facilitate testing 或看到这个QA

【讨论】:

  • 一个非常有用和有用的答案。非常感谢
【解决方案2】:

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

import sys
import unittest

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

【讨论】:

    【解决方案3】:

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

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

    要处理命令行参数,请看这里: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
    

    这适用于您希望从同一代码库进行多个“构建”的任何情况。比如有一个'no database'/'no gui'模式等等。

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2021-08-05
      • 2018-08-18
      相关资源
      最近更新 更多