2012-04-27 16 views
8

मैंने एक पैकेज (http://github.com/anntzer/parsedcmd) लिखा है जो Python2 और Python3 दोनों के साथ चलता है। हालांकि, मुझे Python2 और Python3 के लिए अलग (py.test) यूनिट परीक्षण लिखना पड़ा (मुख्य रूप से क्योंकि मैं विशेष रूप से कीवर्ड-केवल तर्कों में पाइथन 3 की अतिरिक्त विशेषताओं का परीक्षण करना चाहता हूं), इसलिए मेरे पास test_py2.py और test_py3.pytest उप-पैकेज में है । अब, अगर मैं दौड़ता हूं, तो py.test2 mypkg, test_py2 गुजरता है, लेकिन test_py3SyntaxError के साथ विफल रहता है। इसी तरह, py.test3 mypkg के लिए, test_py3 गुजरता है लेकिन test_py2 विफल रहता है (हालांकि यह एक काम कर सकता है, यह StringIO का एक मुद्दा है जो io पर स्थानांतरित हो गया है)।py.test चल रहा है Python2 और Python3

मैं test सबपैकेज डिज़ाइन कर सकते हैं ताकि import mypkg.test केवल परीक्षण के उचित संस्करण का आयात करता है, लेकिन जाहिरा तौर py.test परवाह नहीं करता है - यह सिर्फ दो test_* मिलान फ़ाइलों को देखता है और उन दोनों में सभी परीक्षणों पकड़ लेता है, अनदेखी क्या __init__.py उसे आयात करने के लिए कहता है।

तो अभी मुझे py.test2 mypkg/test/test_py2.py और py.test3 mypkg/test/test_py3.py दोनों करना है। क्या पूरी चीज को स्थापित करने का कोई तरीका है ताकि py.test2 mypkg और py.test3 mypkg "बस काम करें"?

धन्यवाद।

उत्तर

5

यदि आप अपने मॉड्यूल को सभी दुभाषियों पर आयात करने योग्य बना सकते हैं और उचित रूप से परीक्षण छोड़ना एक सामान्य समाधान है। नहीं तो आप "conftest.py" परीक्षण निर्देशिका में के रूप में निम्नलिखित रख सकते हैं:

import sys 
py3 = sys.version_info[0] >= 3 

class DummyCollector(pytest.collect.File): 
    def collect(self): 
     return [] 

def pytest_pycollect_makemodule(path, parent): 
    bn = path.basename 
    if "py3" in bn and not py3 or ("py2" in bn and py3): 
    return DummyCollector(path, parent=parent) 

यह एक परियोजना विशेष प्लगइन उठाया हो जाता है और ठीक से एक फ़ाइल नाम एक "py2" या "युक्त के साथ एक परीक्षण मॉड्यूल पर ध्यान नहीं देगा py3 "गलत दुभाषिया संस्करण पर सबस्ट्रिंग। निस्संदेह आप इसे फ़ाइल नाम आदि की जांच करने के बजाय conftest.py फ़ाइल में सीधे एक स्पष्ट सूची के रूप में परिष्कृत कर सकते हैं।

एचटीएच, होल्डर

0

अपने परीक्षण अलग-अलग पैकेजों में रखें और केवल उचित पैकेज में परीक्षण चलाएं। या फिर एक स्क्रिप्ट में उचित परीक्षण मॉड्यूल लोड:

import sys, unittest 

cur_version = sys.version_info() 

if cur_version[0] < 3 
    import myApp.test.test_py2 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run() 
else: 
    import myApp.test.test_py3 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run() 

या एक setup.py फ़ाइल उपयोग करें ताकि आप

python setup.py test

चला सकते हैं और वहाँ में संस्करण तर्क रख:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here 
setup(name='parsedcmd', 
     ... 
     test_suite=versionedTestSuite, 
    ) 
संबंधित मुद्दे