2014-10-20 44 views
-1

我正在開發一個測試平臺,它通過python gui運行多個測試並打印輸出如下。如何訪問GUI輸出?

A Passed 
B Passed 
C Passed 
D Passed 
E Passed 

gui的按鈕只有在A,B,C,D,E都通過的情況下才能更改爲「通過」。如果其中任何一項測試失敗,則應該說失敗。從屏幕上打印的gui訪問這個輸出的方法是什麼。

我的測試代碼是:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys, os, time 
from PyQt4 import QtGui, QtCore 
from progress.bar import Bar 
import datetime 
import thread 

class MyTestBench(QDialog, QtGui.QWidget): 
    def __init__(self): 
     super(QDialog, self).__init__() 
     self.setWindowTitle("Implementation") 

     self.progressbar = QtGui.QProgressBar() 
     self.progressbar.setMinimum(0) 
     self.progressbar.setMaximum(100) 
     self.run_test_button = QtGui.QPushButton('Run Your Tests') 
     self.run_test_button.clicked.connect(self.run_test_event) 

    def run_test_event(self): 
     thread.start_new_thread(self.run_the_test, ("Thread-1", 0.5)) 
     thread.start_new_thread(self.run_the_progress, ("Thread-2", 0.5)) 


    def run_the_test(self, tname, delay):   
     os.system("python nxptest.py my_testlist.txt") 
     self.progressbar.setValue(100) 
     if self.progressbar.value() == self.progressbar.maximum(): 
      time.sleep(3) 
      self.run_test_button.setText('Run Your Tests') 


    def run_the_progress(self, tname, delay): 
     count = 0 
     while count < 5: 
      self.run_test_button.setText('Running.') 
      time.sleep(0.5) 
      self.run_test_button.setText('Running..') 
      time.sleep(0.5) 
      self.run_test_button.setText('Running...') 
      value = self.progressbar.value() + 10 
      self.progressbar.setValue(value) 
      time.sleep(0.5) 
      if self.progressbar.value() == self.progressbar.maximum(): 
       self.progressbar.reset() 
      count = count + 1 

app = QApplication(sys.argv) 
dialog = MyTestBench() 
dialog.setGeometry(100, 100, 200, 50) 
dialog.show() 
app.exec_() 

我面對這裏是我新的GUI編程,我不知道如何訪問印在屏幕上輸出的主要挑戰。

+0

測試只能通過print語句產生輸出? – mdurant 2014-10-20 18:09:13

+0

@mdurant是的,這項工作是通過nxptest.py模塊完成 – tryPy 2014-10-20 18:33:11

回答

1

如果您試圖獲取程序的文本輸出,則無法使用os.system運行該程序。作爲the docs for that function說:

subprocess模塊提供了產卵新的流程和檢索其結果更加強大的工具;使用該模塊優於使用此功能。請參閱subprocess文檔中的Replacing Older Functions with the subprocess Module部分以獲取一些有用的配方。

如果你按照這些鏈接,他們會顯示如何做你想做的。但基本上,它是這樣的:如果你使用2.6或更早版本,你不會有check_output

output = subprocess.check_output(["python", "nxptest.py", "my_testlist.txt"]) 

;您可以閱讀文檔以瞭解如何自行構建它,例如,communicate,或者您可以從PyPI安裝subprocess32 backport並使用它。


從評論:

這工作,但我唯一擔心的是,有很多結果之前實際打印所傳遞的乙傳遞等印刷有測試..即時通訊尋找方法來獲取這部分字符串而不是整個輸出。

這是不可能的。你的程序怎麼可能知道輸出的哪一部分是「字符串的這一部分」,哪一部分是「很多結果......之前被打印的」?

如果你可以用某種方式編輯正在測試的程序 - 例如,讓它們將「真實」輸出打印到標準輸出,但將它們的「額外」輸出打印到標準錯誤,或者提供一個命令行參數,使它們跳過所有額外的東西 - 這很好。但假設你不能,除了篩選結果之外別無選擇。

但是這看起來不太難。如果「真正的」輸出的每一行是"X Passed""X Failed",並沒有別的與"X "(其中X是任何ASCII大寫字母)開始,這只是:

test_results = {} 
for line in output.splitlines(): 
    if line[0] in string.ascii_uppercase and line[1] == ' ': 
     test_results[line[0]] = line[2:] 

現在,到了最後,你有:

{'A': 'Passed', 'B': 'Passed', 'C': 'Passed', 'D': 'Passed', 'E': 'Passed'} 

如果你想驗證所有的AE的覆蓋,他們都通過了:

passed = (set(test_results) == set('ABCDE') and 
      all(value == 'Passed' for value in test_results.values())) 

當然你可以建立更好的東西,顯示哪些被跳過或沒有通過或什麼。但說實話,如果你想要更強大的東西,你可能應該使用現有的單元測試框架,而不是從頭開始構建一個。

+0

@abarnet謝謝這可以工作,但我唯一擔心的是有很多結果的測試打印之前,它實際打印A通過B通過等。林尋找一種獲得這部分字符串而不是整個輸出的方法。 – tryPy 2014-10-20 19:35:27

+0

@tryPy:然後你必須解析輸出。除非你可以改變你正在測試的程序,所以它不會將實際輸出與不相關的東西混合在一起,這是沒有可能的。 – abarnert 2014-10-20 19:55:44

+0

@ abarnert1 yup ..做了同樣的工作,並得到它..謝謝:) – tryPy 2014-10-20 20:58:11

0

你可以通過一個隊列掩蓋打印輸出,像這樣:

class FileQ(Queue.Queue): 
    def __init__(self): 
     Queue.Queue.__init__(self) 

    def write(self,data): 
     self.put(data) 

class MyTestBench(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.incoming = FileQ() 
     self.setWindowTitle("Implementation") 
     sys.stdout = self.incoming 
     self.time = QtCore.QTimer() 
     self.time.timeout.connect(self.refresh) 
     self.time.start(10) 
     self.t = QtGui.QTextEdit(self) 
     self.t.setObjectName('TextOut') 
     self.box = QtGui.QHBoxLayout(self) 
     self.setLayout(self.box) 
     self.box.addWidget(self.t) 
     self.run_test_event() 
     self.progressbar = QtGui.QProgressBar(self) 
     self.progressbar.setObjectName('BarOut') 
     self.box.addWidget(self.progressbar) 

    def run_test_event(self): 
     thread.start_new_thread(self.run_the_test, ("Thread-1", 0.5)) 

    def run_the_test(self,*args): 
     for i in range(10): 
      print i 
      time.sleep(1) 

    def refresh(self):   
     try: 
      data = self.incoming.get_nowait() 
     except: 
      return 
     if data: 
      self.t.insertPlainText(str(data)) 
      self.progressbar.setValue(int(data)*10)