2013-01-11 10 views
5

Ci scusiamo per la domanda di base. Ho usato il metodo unittest per controllare i miei modelli in uno script. Ora, la mia domanda è: come posso chiamare questo script da un altro file e salvare i risultati dei test. Qui di seguito è il mio codice di esempio:Chiama un python unittest da un altro script ed esporta tutti i messaggi di errore

**model_test.py** 

import unittest 
import model_eq #script has models 

class modelOutputTest(unittest.TestCase): 
    def setUp(self): 
     #####Pre-defined inputs######## 
     self.dsed_in=[1,2] 

     #####Pre-defined outputs######## 
     self.msed_out=[6,24] 

     #####TestCase run variables######## 
     self.tot_iter=len(self.a_in) 

    def testMsed(self): 
     for i in range(self.tot_iter): 
      fun = model_eq.msed(self.dsed_in[i],self.a_in[i],self.pb_in[i]) 
      value = self.msed_out[i] 
      testFailureMessage = "Test of function name: %s iteration: %i expected: %i != calculated: %i" % ("msed",i,value,fun) 
self.assertEqual(round(fun,3),round(self.msed_out[i],3),testFailureMessage) 

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

Il passo successivo che voglio è quello di creare un altro script chiamato test_page.py, che esegue lo script prova di unità e salvare i risultati in una variabile (ho bisogno di inviare i risultati ad una pagina web) .

test_page.py  

from model_test.py import * 
a=modelOutputTest.testMsed() 

Tuttavia, ho ricevuto i seguenti errori.

Traceback (most recent call last): 
    File "D:\Dropbox\AppPest\rice\Rice_unittest.py", line 16, in <module> 
    a= RiceOutputTest.testMsed() 
TypeError: unbound method testMsed() must be called with RiceOutputTest instance as first argument (got nothing instead) 

Qualcuno può darmi qualche suggerimento? Grazie!

Grazie per l'aiuto di Nix! La mia prossima domanda è: ho bisogno di testare la funzione con due casi dati in un ciclo. È pubblicato here.

+0

Si dovrebbe dividere la modifica in una nuova domanda. – Nix

+0

Perché hai 'return a' nel tuo ciclo for? Dovresti rimuoverlo. – Nix

+0

Ho spostato una nuova domanda qui. http://stackoverflow.com/questions/14285010/python-unit-testing-a-loop-function –

risposta

12

è necessario utilizzare un test runner

prova corridore Un test runner è un componente che dirige l'esecuzione delle prove e fornisce l'esito all'utente. Il corridore può utilizzare un'interfaccia grafica, un'interfaccia testuale o restituire un valore speciale per indicare i risultati dell'esecuzione dei test.

from unittest.case import TestCase 
import unittest 
from StringIO import StringIO 
class MyTestCase(TestCase): 
    def testTrue(self): 
     ''' 
     Always true 
     ''' 
     assert True 

    def testFail(self): 
     ''' 
     Always fails 
     ''' 
     assert False 

from pprint import pprint 
stream = StringIO() 
runner = unittest.TextTestRunner(stream=stream) 
result = runner.run(unittest.makeSuite(MyTestCase)) 
print 'Tests run ', result.testsRun 
print 'Errors ', result.errors 
pprint(result.failures) 
stream.seek(0) 
print 'Test output\n', stream.read() 

>>> Output: 
>>> Tests run 2 
>>> Errors [] 
>>> [(<__main__.MyTestCase testMethod=testFail>, 
>>> 'Traceback (most recent call last):\n File "leanwx/test.py", line 15, in testFail\n    assert False\nAssertionError\n')] 
>>> Test output 
>>> F. 
>>> ====================================================================== 
>>> FAIL: testFail (__main__.MyTestCase) 
>>> ---------------------------------------------------------------------- 
>>> Traceback (most recent call last): 
>>> File "leanwx/test.py", line 15, in testFail 
>>>  assert False 
>>> AssertionError 
>>> 
>>>---------------------------------------------------------------------- 
>>>Ran 2 tests in 0.001s 
>>> 
>>>FAILED (failures=1) 
+0

Grazie mille per aver contribuito a questo problema !!! Ho imparato i tuoi esempi. Una domanda, ci sono documenti che posso trovare tutti i metodi disponibili per unittest.TextTestRunner (come result.testsRun, result.errors)? Anche per stream.read()? –

+0

Questo potrebbe essere d'aiuto: http://docs.python.org/2/library/unittest.html#unittest.TestResult mostra la maggior parte delle cose a cui puoi accedere nel test runner. Per quanto riguarda lo stream, è un stringio che è una stringa "file like". Non dovrebbe essere usato se si ha molta produzione. Dovresti invece scrivere l'output in un file e poi leggerlo. – Nix

+0

Ultima domanda ... Devo includere "assertNotEqual" se voglio stampare alcuni messaggi relativi a una funzione testata con successo? –

Problemi correlati