2012-02-04 12 views
10

मैं पाइथन के साथ प्राथमिक रूप से एक (बल्कि जटिल) बैश पूर्णता स्क्रिप्ट के लिए एक यूनिट टेस्ट लिखना चाहता हूं - केवल कुछ ऐसा जो बैश पूर्ण होने के मूल्यों को प्रोग्रामेटिक रूप से प्राप्त करता है। परीक्षण इस तरह दिखना चाहिए:बैश पूर्णता स्क्रिप्ट के लिए यूनिट टेस्ट

def test_completion(): 
    # trigger_completion should return what a user should get on triggering 
    # Bash completion like this: 'pbt createkvm<TAB>' 
    assert trigger_completion('pbt createkvm') == "module1 module2 module3" 

मैं अपने उपकरण के लिए एक testsuite अंदर पूरा होने के मूल्यों की जाँच करने के लिए प्रोग्राम के रूप में बैश पूरा होने के अनुकरण कर सकते हैं?

+2

करता है [इस] (स्थित है http:

अंतिम समाधान अजगर से बैश पूरा होने के परीक्षण करने के लिए एक सहायक वर्ग इतना है कि इसके बाद के संस्करण परीक्षण के रूप में लिखा जाएगा है : //stackoverflow.com/questions/3520936/accesssing-bash-completions-for- विशिष्ट- कमांड- प्रोग्रामेटिक रूप से) मदद करता है? हालांकि मैंने इसे खुद कोशिश नहीं की है। – Vikas

+1

यदि आप उपयोगकर्ता इंटरैक्शन को अनुकरण करना चाहते हैं, तो 'उम्मीद' आपका मित्र है - पाइथन में अपना एफएस/एनवी सेटअप करें और फिर सबप्रोसेस के साथ एक उम्मीद स्क्रिप्ट के भीतर से बैश चलाएं। भागने मुश्किल हो सकता है, लेकिन अन्यथा यह बहुत सरल है। – je4d

उत्तर

6

आप asdf-completion नामक एक फ़ाइल में एक पार्टी-पूर्ण स्क्रिप्ट है, जिसमें कहते हैं:

_asdf() { 
COMPREPLY=() 
local cur prev 
cur=$(_get_cword) 
COMPREPLY=($(compgen -W "one two three four five six" -- "$cur")) 
return 0 
}  
complete -F _asdf asdf 

यह काल्पनिक asdf आदेश को पूर्ण करने का प्रदान करने के लिए खोल समारोह _asdf उपयोग करता है। यदि हम सही पर्यावरण चर सेट करते हैं (बैश मैन पेज से), तो हम एक ही परिणाम प्राप्त कर सकते हैं, जो COMPREPLY चर में संभावित विस्तार की नियुक्ति है। यहाँ एक unittest में कर रही है कि का एक उदाहरण है:

import subprocess 
import unittest 

class BashTestCase(unittest.TestCase): 
    def test_complete(self): 
     completion_file="asdf-completion" 
     partial_word="f" 
     cmd=["asdf", "other", "arguments", partial_word] 
     cmdline = ' '.join(cmd) 

     out = subprocess.Popen(['bash', '-i', '-c', 
      r'source {compfile}; COMP_LINE="{cmdline}" COMP_WORDS=({cmdline}) COMP_CWORD={cword} COMP_POINT={cmdlen} $(complete -p {cmd} | sed "s/.*-F \\([^ ]*\\) .*/\\1/") && echo ${{COMPREPLY[*]}}'.format(
       compfile=completion_file, cmdline=cmdline, cmdlen=len(cmdline), cmd=cmd[0], cword=cmd.index(partial_word) 
       )], 
      stdout=subprocess.PIPE) 
     stdout, stderr = out.communicate() 
     self.assertEqual(stdout, "four five\n") 

if (__name__=='__main__'): 
    unittest.main() 

यह किसी भी पूर्ण करने कि -F का उपयोग के लिए काम करना चाहिए, लेकिन साथ ही दूसरों के लिए काम कर सकते हैं।

expect का उपयोग करने के लिए je4d की टिप्पणी अधिक पूर्ण परीक्षण के लिए एक अच्छा है।

+0

वाह, बिल्कुल वही जो मैं चाहता था। – ifischer

0

बोन्साइविकिंग का समाधान लगभग मेरे लिए काम करता था। मुझे बैश स्ट्रिंग स्क्रिप्ट को बदलना पड़ा। मैंने एक अतिरिक्त ';' जोड़ा विभाजित बैश स्क्रिप्ट से विभाजक अन्यथा निष्पादन मैक ओएस एक्स पर काम नहीं करेगा। वास्तव में क्यों नहीं।

मैंने विभिन्न COMP_ तर्कों को शुरू करने के लिए कुछ अलग-अलग मामलों को संभालने के लिए सामान्यीकृत किया।

from completion import BashCompletionTest 

class AdsfTestCase(BashCompletionTest): 
    def test_orig(self): 
     self.run_complete("other arguments f", "four five") 

    def run_complete(self, command, expected): 
     completion_file="adsf-completion" 
     program="asdf" 
     super(AdsfTestCase, self).run_complete(completion_file, program, command, expected) 


if (__name__=='__main__'): 
    unittest.main() 

पूरा होने lib तहत https://github.com/lacostej/unity3d-bash-completion/blob/master/lib/completion.py

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