2017-04-26 81 views
0

我試圖在聲明發生時以及在調用任何清理代碼之前捕獲儘可能多的信息。 下面是大多數現有的測試看起來像一個簡化代碼:如何在聲明中調用方法

在我conftest.py:

import pytest 
from datetime import datetime 

def pytest_runtest_makereport(item, call): 
    print('%s: pytest_runtest_makereport(%s)' % (datetime.now(), call)) 

def pytest_exception_interact(node, call, report): 
    print('\n%s: pytest_exception_interact' % datetime.now()) 

在我的測試文件:

import pytest 
from datetime import datetime 

@pytest.fixture(scope='function') 
def marshall_me(): 
    print('\n%s: starting test' % datetime.now()) 
    yield marshall_me 
    print('\n%s: ending test' % datetime.now()) 

class Device(object): 
    def __enter__(self): 
     print('\n%s: create object' % datetime.now()) 
     return self 

    def __exit__(self, type, value, traceback): 
     print('\n%s: clean-up object' % datetime.now()) 

def test_fails(marshall_me): 
    with Device(): 
     assert False 

當我運行此我得到:

test_fails.py::test_fails 2017-04-26 17:07:37.447359: starting test 
2017-04-26 17:07:37.447453: pytest_runtest_makereport(<CallInfowhen='setup' result: []>) 
2017-04-26 17:07:37.447583: create object 
2017-04-26 17:07:37.448397: clean-up object 
2017-04-26 17:07:37.448614: pytest_runtest_makereport(<CallInfowhen='call' exception: assert False>) 
FAILED 
2017-04-26 17:07:37.462267: pytest_exception_interact 
2017-04-26 17:07:37.462353: ending test 
2017-04-26 17:07:37.462428: pytest_runtest_makereport(<CallInfo when='teardown' result: []>) 

我不能使用pytest_runtest_makereport和pytest_exception_interac因爲他們在清理完成後會被打電話給我,這對我來說很難收集到重要的信息。是否還有其他類似的函數在斷言實際生成時被調用?

回答

1

你有斷言語句的另一種形式:

assert <cond>, <expr> 

這意味着解釋是首先評估條件,如果這是假時,將計算表達式用作參數AssertionError。因此,要呼籲斷言失敗的功能你會使用這個:

assert condition_to_be_true(), function_to_call_if_not_true() 

注意的function_to_call_if_not_true()返回值將作爲參數傳遞給AssertionError。如果這不是你想要的,你需要做一些技巧來改變表達式的結果 - 你可以使用布爾運算符來實現這一點。不管x是什麼表達式(x and False) or y將評估爲y(通過Python的短路規則)。

要包起來,你會怎麼做:

assert condition_to_be_true(), (function_to_call_if_not_true() 
        and False) or ARGUMENT_TO_AssertionError 

另一種方式來做到這一點是濫用語言,如果你必須(這應該被認爲是邪惡的)。由於斷言語句相當於確認條件爲假後,是提高AssertionError你可以簡單地重新定義它:這裏

class AssertionError(Exception): 
    def __init__(self, *args, **kwds): 
     Exception(self, *args, **kwds) 
     print("Assertion") 

assert condition_to_check() 

注意,這是在assert聲明,你需要的電流範圍AssertionError值重新定義。

+0

您的第二個替代方案適用於我作爲我們現有測試的批發解決方案。我明白,這不是應該如何做的事情,如果我從頭開始,肯定會有更優雅的解決方案來使用。謝謝。 –