2014-10-20 58 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)