如何断言所有断言在python中失败

时间:2019-05-24 11:21:53

标签: python pytest assert

我正在尝试编写有关如何不在pytest中编写测试的示例。为此,我希望能够以某种方式修改测试功能,以使任何断言通过时它们都会失败。使用装饰器只需使用一个断言就可以轻松实现这一点:

def faulty_test(test_fn):
    def new_test_fn():
        try:
            test_fn()
        except AssertionError:
            pass
        else:
            raise AssertionError

    return new_test_fn

@faulty_test
def test_sth():
    assert 1 == 2

但我想对具有任意数量的断言的函数执行此操作。如果任何断言通过,则测试应失败。不必是装饰者

4 个答案:

答案 0 :(得分:0)

我想它不必是多个断言。您可以编写:

assert a == b or c == d or # so on

任何条件为True都会导致断言通过。

答案 1 :(得分:0)

也许您应该这样考虑:在异常发生时,执行离开try块并进入except块。至少不能以我能想到的任何简单方式,您都不能从except块内重新输入try块。

也许我对这个问题有误解,但是您不能简单地用这些断言的反义词代替您的断言吗?如果您想断言某件事是假的,可以:

assert not (1 == 2)

如果由于某种原因您正在处理这样的情况,即您假设给定的函数由于某种原因将始终使它们的断言失败,并且您无法更改,则似乎没有任何方法可以确保所有断言运行,因为断言的设计是有意在失败时立即中止。

答案 2 :(得分:0)

如果对声明进行“编号”,则捕获一个值大于0的声明就意味着先前传递的声明。

def faulty_test(test_fn):
    def new_test_fn():
        try:
            test_fn()
        except AssertionError as exc:
            if exc.args[0] > 0:
                # Assertions 0 through exc.args[0]-1 all passed
                raise AssertionError
        else:
            raise AssertionError

    return new_test_fn

@faulty_test
def test_sth():
    assert 1 == 2, 0
    assert 2 == 3, 1
    assert 3 == 4, 2

答案 3 :(得分:0)

您可能应该在函数代码中使用_debug或其他(隐藏的)参数来处理该问题。然后,您可以在其上使用装饰器。我会怎么做:

def deco(inF):
    def wrapper(*args, **kwargs):
        kwargs['_debug'] = True
        output = inF(*args, **kwargs)
        #print(output)
        for i, _ in enumerate(zip(*output)):
            condition, msg = _
            # this will raise the first passed assert. Otherwise loop again to print all "passed" assertions, then raise
            if not condition:
                raise AssertionError('Condition {} succeded: {} is False'.format(1 + i, msg))
        return output
    return wrapper

@deco
def f(i, j , k, _debug=False):
    cond1, msg1 = i == 1, 'i is not 1'
    cond2, msg2 = j == 2, 'j is not 2'
    cond3, msg3 = k == 3, 'k is not 3'
    assert cond1 or _debug, msg1
    assert cond2 or _debug, msg2
    assert cond3 or _debug, msg3
    if _debug:
        return (cond1, cond2, cond3), (msg1, msg2, msg3) 
    return i + j + k

f(1,1,5)
>>AssertionError: Condition 2 succeded: j is not 2 is False