在 TestCase 的 setUp 函数中,我将成员变量 is_type 设置为 True 或 False。我在类中有一些测试,如果值为 false,则不应运行这些测试。我不知道如何使用 skipif 功能来做到这一点。

@py.test.mark.skipif( not ???.is_type )
def test_method(self):
   ...
self??? 不起作用,因为它还不在对象中。如何引用 is_type 变量?

更完整的例子:
class DBTest(unittest.TestCase):
    def setUp(self):
        self.is_dynamo = os.environ.get( 'TEST_DB', '' ) == 'Dynamo'

    def test_account_ts(self):
        if not self.is_dynamo:
            return

        ...

如何将 if not self.is_dynamo 转换为 py.test skipif 条件?

最佳答案

正如您所提到的,您不能在 skipif 标记中引用实例,因为该实例尚不存在。

我会保持简单并执行以下操作:

@pytest.mark.skipif(os.environ.get('TEST_DB') != 'Dynamo')
def test_dynamo():
    db = MyDatabaseWithDynamo(is_dynamo=True)
    # Some assertion or other.

您也可以在类上使用 @pytest.mark.skipif

关于这个特性的 documentation 有一些很好的例子。其中许多与检查部分环境以决定应该跳过哪些测试有关。这听起来与您的用例非常相似,所以我会说您的公司很好。

但是,如果正如您在下面的评论中所说,您想避免使用全局变量,则可以从任何地方引发 pytest.skip 异常。下面我是在一个装置中进行的,我认为它可以使测试设置与测试用例很好地分开。有关更多可能性,请参阅 the documentation

这是我的测试文件:
import os
import pytest

class MyDatabaseWithDynamo(object):
    def __init__(self, is_dynamo):
        pass

@pytest.fixture
def database():
    is_dynamo = os.environ.get('TEST_DB') == 'Dynamo'
    if not is_dynamo:
        raise pytest.skip()
    return MyDatabaseWithDynamo(is_dynamo=True)

def test_db(database):
    pass

这是测试输出:
$ py.test test_foo.py
======================================= test session starts =======================================
platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2
collected 1 items

test_foo.py s

==================================== 1 skipped in 0.01 seconds ===================================

关于python - 如何使用 py.test skipif 检查成员变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22603562/

10-12 22:46