2015-04-08 7 views
6

मैं परीक्षण विफलताओं का आत्मनिरीक्षण करने की कोशिश कर रहा हूं और जूनिट एक्सएमएल परीक्षण रिपोर्ट में अतिरिक्त डेटा शामिल कर रहा हूं। विशेष रूप से, यह बाहरी उत्पाद पर कार्यात्मक परीक्षणों का एक सूट है, और मैं विफलता रिपोर्ट में उत्पाद के लॉग शामिल करना चाहता हूं।अनुकूलन pytest junitxml विफलता रिपोर्ट

here मिली विधि का उपयोग करके, मैं मल्टीकॉल को निष्पादित करने से पहले stdout पर लॉग प्रिंट करने में सक्षम था जो आखिरकार जेनकिन की विफल रिपोर्ट में दिखाया गया था। लेकिन मुझे यकीन है कि इसे हासिल करने का एक बेहतर तरीका है।

मैंने लॉग को 'सेक्शन' विशेषता में जोड़ने के लिए pytest_runtest_logreport हुक का उपयोग करने का प्रयास किया, जिसमें पहले से ही 'कैप्चर स्टडआउट' और 'कैप्चर स्टडर' स्ट्रीम शामिल हैं। लेकिन नए जोड़े गए अनुभाग इसे xml फ़ाइल में नहीं बनाते हैं। मैंने उपरोक्त तकनीक को सीधे pytest_runtest_makereport हुक में भी इसी तरह के परिणामों के साथ करने की कोशिश की।

पायस्टेस्ट 2.7 के लिए रिलीज नोट्स का कहना है कि मल्टीकॉल समर्थन का उपयोग 2.8 के लिए किया जा रहा है और @ pytest.mark.hookwrapper इसे करने का नया तरीका है, हालांकि मैं यह काम बिल्कुल नहीं कर सकता - "उपज" रिटर्न किसी कॉलऑट्यूम ऑब्जेक्ट के बजाय कोई नहीं (इसे मेकपोर्टपोर्ट हुक में आज़माएं)। और यहां तक ​​कि अगर यह कुछ लौटा, तो मुझे यकीन नहीं है कि मैं इसमें सामान जोड़ सकता हूं जो एक्सएमएल रिपोर्ट में दिखाई देगा।

क्या कोई कार्यक्षमता है जो मुझे याद आ रही है जो मुझे इसे लचीला तरीके से करने देगी? (लचीला से मेरा मतलब है: कैप्चर-लॉग प्लगइन जैसे कॉल या स्टॉग करने के लिए बाध्य नहीं होना)

उत्तर

6

संपादित करें: चूंकि मुझे अपनी रिपोर्टिंग के लिए टेस्ट आइटम के funcargs (और परीक्षा परिणाम) तक पहुंच की आवश्यकता है, इसलिए मैं तर्क को pytest_runtest_makereport(item, __multicall__) हुक में स्थानांतरित करने में सक्षम था। चाल multicall है, जो रिपोर्ट ऑब्जेक्ट निष्पादित करने के लिए है:

@pytest.mark.tryfirst 
def pytest_runtest_makereport(item, call, __multicall__): 
    report = __multicall__.execute() 
    # then I was able to manipulate report and get the same results as below 

ब्रूनो के जवाब मुझे प्रेरणा मैं इस सुविधा अधिक अच्छी तरह से :)

तो यहाँ यह कैसे काम करता है का विश्लेषण करने के लिए आवश्यक दिया:

def pytest_runtest_logreport(report): 
    if report.failed: 
     report.longrepr.sections.append(("Header", "Message", "-")) 
     report.sections.append(("Captured stdout", "This is added to stdout")) 
     report.sections.append(("Captured stderr", "This is added to stderr")) 
     report.sections.append(("Custom Section", "This can only be seen in the console - the xml won't have it.")) 

longrepr विशेषता केवल विफलताओं के मामले में उपलब्ध है। यह 3-ट्यूपल लेता है, आखिरी मूल्य एक चरित्र होता है जिसे सजाने/शीर्षलेख को सजाने के लिए उपयोग किया जाता है। यह रिपोर्ट की "विफलता" खंड में दिखाई देगा:

----------------------------------- Header ------------------------------------ 
Message 

कस्टम अनुभाग अतिरिक्त परिणाम वर्गों पैदा करेगा सांत्वना के लिए बाहर मुद्रित करने के लिए। लेकिन वे इसे जूनिटक्सएमएल नहीं बनायेंगे:

------------------------------- Custom Section -------------------------------- 
This can only be seen in the console - the xml won't have it. 

जूनिटक्सएमएल रिपोर्ट में केवल 2 अनुभाग हैं: बाहर और गलती। इसमें कस्टम टेक्स्ट जोड़ने के लिए, आपको "कैप्चरर्ड स्टडी" नामक अनुभाग बनाना होगा और केवल वे इसे XML फ़ाइल में लाएंगे। किसी अन्य नाम का परिणाम कस्टम सेक्शन में होगा जो केवल कंसोल में ही देखा जाएगा।

यहाँ ऊपर कोड का उपयोग कर, इस पोस्ट की खातिर कुछ reformatting के साथ जिसके परिणामस्वरूप junitxml है:

<?xml version="1.0" encoding="utf-8" ?> 
<testsuite errors="0" failures="1" name="pytest" skips="0" tests="1" time="0.646"> 
    <testcase classname="test_reporting" name="test_fail" time="0.000999927520752"> 
    <failure message="test failure"> 
     @ut def test_fail(): > assert 0, "It failed" 
     E AssertionError: It failed 
     E assert 0 test_reporting.py:346: AssertionError 
     ----------------------------------- Header ------------------------------------ 
     Message 
    </failure> 
    <system-out>This is added to stdout</system-out> 
    <system-err>This is added to stderr</system-err> 
    </testcase> 
</testsuite> 
+0

यह समाधान अब '__multicall__' तर्क के लिए एक बहिष्करण चेतावनी उत्पन्न करता है। मुझे आश्चर्य है कि क्या इससे अच्छी तरह से बचने का कोई तरीका है। एकमात्र चीज जो मैंने करने में कामयाब रहा है वह रिपोर्ट प्राप्त करने के लिए _pytest.runner आयात pytest_runtest_makereport _pytest_runtest_makereport' के साथ इस हुक के सबसे पुराने मूल कार्यान्वयन को कॉल करना है। – meili

3

एक परीक्षण रिपोर्ट (एक्सएमएल, कंसोल या अन्यथा) में जानकारी जोड़ने के लिए कृपया reporting hooks पर विशेष रूप से देखें, अधिक विशेष रूप से pytest_runtest_logreport पर ।

+0

मैं यह मतलब नहीं था इस सवाल JUnit-विशिष्ट बनाने का। मुझे वास्तव में आवश्यकता है कोड से पाइस्टेस्ट की विफलता रिपोर्ट में मनमानी डेटा इंजेक्ट करने का एक तरीका है। लॉगिंग दृष्टिकोण काम करता है (यह वही है जो मैं उपयोग कर रहा हूं) लेकिन मुझे '-s' स्विच का उपयोग करने से रोकता है (इसका उपयोग करके pytest stdout को कैप्चर नहीं करेगा, और इस प्रकार कंसोल पर लॉग इन करने से यह जूनिट रिपोर्ट को बिल्कुल नहीं पहुंचाएगा)। – Joe

+0

ओह मैं देखता हूँ। तब मेरा जवाब अपडेट किया गया। –

+0

टीएनएक्स;) लेकिन इस हुक का पहले से ही मेरे मूल पोस्ट में उल्लेख किया गया है ... मुझे लगता है कि मैं इसे गलत इस्तेमाल कर रहा था? – Joe

संबंधित मुद्दे