2009-06-22 11 views
37

पर कमांड लाइन विकल्प पास करने का कोई तरीका है मेरे पास एक मॉड्यूल है जो आयात करता है और कुछ टेस्टकेस हैं। मुझे कुछ कमांड लाइन विकल्पों को स्वीकार करने के लिए चाहिए (उदाहरण के लिए, डेटा फ़ाइल का नाम), लेकिन जब मैं विकल्प पास करने का प्रयास करता हूं तो मुझे संदेश "विकल्प-मैं पहचाना नहीं जाता"। क्या ऐप को विकल्प उपलब्ध कराने के लिए संभव है (नोट: मैं विकल्प को संभालने के लिए ऑप्टपर का उपयोग कर रहा हूं)? धन्यवाद।पायथन, unittest: ऐप

$ python test_app_data.py -i data_1.txt 

option -i not recognized 

=====================

अनुवर्ती:

import cfg_master #has the optparse option-handling code 

... 

if __name__ == '__main__':  
    #add you app's options here... 
    options_tpl = ('-i', '--in_dir', '-o', '--out_dir') 
    del_lst = [] 
    for i,option in enumerate(sys.argv): 
     if option in options_tpl: 
      del_lst.append(i) 
      del_lst.append(i+1) 

    del_lst.reverse() 
    for i in del_lst: 
     del sys.argv[i] 

    unittest.main() 
: इस सुझाव दिया समाधान के एक कार्यान्वयन है
+0

फोन argparse.ArgumentParser कॉल करने से पहले() सामान्य शब्दों में, हाँ। इस मामले में, उत्तर उन विवरणों पर निर्भर करता है जो आपने नहीं दिए हैं। –

+0

@jd। आपका "फॉलो-अप" उत्तर के रूप में पोस्ट किया जाना चाहिए - आपके प्रश्न में केवल ... अच्छा ... प्रश्न होना चाहिए। – user1251007

उत्तर

45

बिल्डिंग एलेक्स के जवाब पर, यह वास्तव में बहुत आसान argparse का उपयोग कर करना है:

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--input', default='My Input') 
    parser.add_argument('filename', default='some_file.txt') 
    parser.add_argument('unittest_args', nargs='*') 

    args = parser.parse_args() 
    # TODO: Go do something with args.input and args.filename 

    # Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone) 
    sys.argv[1:] = args.unittest_args 
    unittest.main() 

मैं परीक्षण नहीं किया झंडे के सभी आप unittest में पारित देखने के लिए अगर वे काम करते हैं या नहीं कर सकते हैं, लेकिन परीक्षण गुजर कार्य करता है, जैसे में नाम:

python test.py --input=foo data.txt MyTest 

रन foo और data.txt साथ MyTest।

+3

अच्छा! इससे भी बेहतर, 'unittest.main()' एक argv पैरामीटर स्वीकार करता है, इसलिए आपको वैश्विक sys.argv के साथ गड़बड़ नहीं करना है, उदा। इस तरह: 'unit_argv = [sys.argv [0]] + args.unittest_args; unittest.main (argv = unit_argv) ' – wutz

+3

आप इसके बजाय' .parse_known_args() 'का उपयोग कर सकते हैं और 'nargs =' * '' विकल्प का उपयोग करने की आवश्यकता नहीं है; देखें [पायथन: मेरे संस्करण के लिए unittest.main()?] (http://stackoverflow.com/a/17259773) को कॉल किए बिना एक unittest.TestCase चलाएं। –

+0

मैंने इस जवाब को @MartijnPieters द्वारा संदर्भित प्रश्न से जोड़ा, क्योंकि दृष्टिकोण ने मुझे अपील की। हालांकि, जब मैंने यह जवाब लागू किया, तो झंडे (- फायरफास्ट और - कैच) पास करते समय मेरे लिए काम नहीं किया, इसलिए मैं मार्टिजन के जवाब पर वापस आ गया। –

31

अपने if __name__ == '__main__': खंड है, जो आप हमें नहीं दिखा रहे हैं, आप optparse करने की आवश्यकता होगी और उसके बाद del sys.argv[1:] इससे पहले कि आप unittest कोड को नियंत्रण बढ़ाने के लिए इतना है कि बाद के कोड अपने आदेश पंक्ति विकल्पों की व्याख्या करने की कोशिश नहीं कर रहा है फिर तुम कब आप पहले से ही उनके साथ निपटा चुके हैं। (आपके और के कुछ विकल्प होने के लिए थोड़ा मुश्किल है, कुछ unittest पर भी पास करें, हालांकि यदि आपके पास ऐसी जटिल ज़रूरतें हैं तो यह किया जा सकता है)।

+0

महान, धन्यवाद; बस पुष्टि करने के लिए: सबसे पहले (संभवतः एकाधिक और परिवर्तनीय) ऐप विकल्पों को संभालने के लिए ऑप्टपरसे को अनुमति दें, फिर उन्हें sys.argv से हटा दें, और आखिरकार एकजुट होने की अनुमति दें? –

+0

@jd yep, यह इसका सारांश है! –

+0

शानदार, धन्यवाद एलेक्स! मैं इसे बिल्कुल काम नहीं कर सका: पी – Skilldrick

-7

आपको unittests चलाने के लिए तर्क और विकल्प नहीं लेना चाहिए, क्योंकि आप उन्हें अलग-अलग, कम अनुमानित स्थितियों के तहत इस तरह से चलाते हैं। आपको यह पता लगाना चाहिए कि आपको अलग-अलग डेटा के साथ परीक्षण चलाने की आवश्यकता क्यों है, और आपको हर बार अलग-अलग चलाने के बिना सभी डेटा सेटों के ग्राउंड को कवर करने के लिए पर्याप्त सूट का परीक्षण किया जाता है।

+0

मुझे साप्ताहिक डेटा रिपोर्ट (फाइलें) प्राप्त होती हैं; सार्वजनिक रिपोर्ट बनाने से पहले, मैं इन नई रिपोर्टों को unittests को खिलाना चाहता हूं। अगर किसी कारण से डेटा की संरचना या प्रकार बदल गया है (उदाहरण के लिए एक नया कॉलम फ़ील्ड जोड़ा गया था, एक डेटा रेंज बदल दी गई थी और एक बग का अनावरण किया गया था) मैं उन्हें परीक्षणों के साथ पकड़ना चाहता हूं। उम्मीद है कि यह समझ में आता है। –

+2

यकीन है कि डेटा सत्यापन, unittesting नहीं है। – ironfroggy

+2

सशर्त परीक्षण छोड़ने के बारे में कैसे?मैं अपने सभी परीक्षण मामलों को एकजुट परीक्षण परीक्षा करके चलाता हूं, लेकिन यह अच्छा होगा कि @skipUnless ('- पूर्ण' sys.argv में) जैसे कुछ परीक्षणों पर एनोटेशन प्राप्त करने में सक्षम होना चाहिए ताकि मेरे पास एक आसान कमांड लाइन तरीका हो सभी परीक्षणों, या केवल कुछ चलाने के लिए। –

1

छोटे स्टैंडअलोन एप्लिकेशन के लिए, मैं एक प्रारंभिक प्रहरी विकल्प (-t) का उपयोग करें और unittest.main()

if __name__ == "__main__": 
    if len(sys.argv) > 1 and sys.argv[1] in ["-t", "--test"]: 
     del(sys.argv[1]) 
     sys.exit(unittest.main()) # pass sys.argv[ 

    p = argparse.ArgumentParser() 
    . . . 
संबंधित मुद्दे