2013-01-11 13 views
5

基本的な質問は申し訳ありません。 unittestメソッドを使用して、1つのスクリプトでモデルをチェックしました。今、私の質問は、私は別のファイルからこのスクリプトを呼び出すとテスト結果を保存する方法です。以下は、私のコードのサンプルです:別のスクリプトからpython unittestを呼び出し、すべてのエラーメッセージをエクスポートしてください

**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() 

私が欲しいの次のステップは、ユニット・テスト・スクリプトを実行しますtest_page.pyと呼ばれる別のスクリプトを作成し、変数に結果を保存することです(私はウェブページに結果を投稿する必要があります) 。

test_page.py  

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

ただし、次のエラーが発生しました。

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) 

誰でも私にいくつかの提案を教えてもらえますか?ありがとう!

Nixのおかげでよろしく!私の次の質問は、ループ内で2つのケースを使って関数をテストする必要があることです。投稿されたのはhereです。

+0

あなたは新しい質問にあなたの編集を分割する必要があります。 – Nix

+0

forループに 'return a'があるのはなぜですか?削除する必要があります。 – Nix

+0

ここで新しい質問を移動しました。 http://stackoverflow.com/questions/14285010/python-unit-testing-a-loop-function –

答えて

12

あなたがtest runner

テストランナー テストランナーはテストの実行と結果表示を管理するコンポーネントで使用する必要があります。ランナーは、グラフィカルインターフェース、テキストインターフェースを使用するか、またはテストを実行した結果を示す特別な値を戻すことができます。

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

この問題を手伝ってくれてありがとう!私はあなたの例を学びました。 1つの質問は、unittest.TextTestRunner(result.testsRun、result.errorsなど)のすべての利用可能なメソッドを見つけることができるドキュメントはありますか?また、stream.read()について? –

+0

これは役立つかもしれません:http://docs.python.org/2/library/unittest.html#unittest.TestResultテストランナーがアクセスできるほとんどのことを示しています。ストリーミングに関しては、 "ファイルのような"文字列であるstringioがあります。多くの出力がある場合は、使用しないでください。その代わりに出力をファイルに書き込んでから読み込んでください。 – Nix

+0

最後の質問...関数についてのいくつかのメッセージが正常にテストされた場合、 'assertNotEqual'を含めるべきですか? –

関連する問題