停用仅适用于自动执行的Python单元测试吗?

时间:2019-11-28 20:14:09

标签: python pycharm python-unittest

装饰器@unittest.SkipTest阻止在测试类中运行单元测试时自动执行单元测试。不幸的是,这也使 PyCharm中的单个执行(通过右键单击该函数,然后 为该测试方法选择运行/调试)失败,并显示TypeError: don't know how to make test from: <function .... at 0x7fbc8e1234c0> 有没有办法从自动(批量)执行中禁用单元测试 当运行完整的测试类时,却将其手动执行(最好在PyCharm中执行),以便可以运行它而无需在测试文件中进行任何更改? 我想 @unittest.skipUnless(condition, reason) 可能会派上用场,但无法提出仅在测试通过后才能满足的条件 手动发射。任何建议表示赞赏!

2 个答案:

答案 0 :(得分:1)

您是否尝试过包含通过CI / CD运行时设置的参数?您可以将默认值设置为false,然后CI / CD将其设置为true。这将为您提供所需的条件。

据我所知,区分CI / CD运行和IDE运行的唯一方法是必须设置一些中间参数。

编辑: 尝试在PyCharm中为该特定测试设置自定义构建配置。您可以让该构建配置将参数传递给测试套件。届时,您将有适当的条件,当使用命令行与PyCharm的集成测试运行程序运行测试时,不要跳过此测试。

为简单起见,您希望参数的默认值是跳过,并且仅通过在PyCharm中的特殊构建配置中将True传递给该参数来将布尔值设置为不跳过。

请参阅:https://www.jetbrains.com/help/idea/build-configuration.html

答案 1 :(得分:0)

我会尝试使用仅在PyCharm或其他IDE中设置的参数来控制它。

也就是说,您可以将skipUnless(...)用于与PyCharm测试配置中定义的环境变量有关的条件。

这是一个完整的示例:

import os
import unittest


def is_prime(n):
    """ Return whether `n` is prime. """
    return n == 2 or not (n % 2 == 0 or any(n % i == 0 for i in range(3, n, 2)))


class IsPrimeTest(unittest.TestCase):
    @unittest.skipUnless(os.getenv('MYPROJECT_DEVELOPMENT_TEST'), reason="Lengthy test")
    def test_is_prime(self):
        self.assertTrue(is_prime(2))
        self.assertTrue(is_prime(3))
        self.assertFalse(is_prime(4))
        self.assertTrue(is_prime(5))

从外壳运行时,确实跳过了测试:

$ python3 -m unittest test_example.py 
s
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK (skipped=1)

如果选择“编辑配置...”,则可以在测试配置中设置特定的环境变量,如下面的屏幕快照所示。进行此更改后,所涉及的测试实际上是在PyCharm中运行的(未显示)。

PyCharm unit test configuration showing environment variables set