2017-01-16 3 views
3

は、ボイラープレートコードを減らすために私はすべてのパラメータなしのメソッドのクラステスターでテストケースを生成するという考えに出くわしました。 py.testを実行する上でパラメータレスメソッドのテストケースを自動生成する方法は?

、それだけでが動的にsetattr(Tester,'test_' + name, member)

を使用してテストケースを作成し静的に書かれたテストケース(test_a、TEST_B)を認識するだけではないかもしれpy.testはすでにクラスのテスターを視察しましたsetUpClassが呼び出される前に 'test_ *'を持つメソッドのために?どのようにこれを実行するヒント?

import inspect 
import unittest 


class Testee: 
    def a(self): 
     print('a') 

    def b(self): 
     print('b')  

    #... 

    #... 
    def z(self): 
     print('z') 

class Tester(unittest.TestCase): 

    @classmethod 
    def setUpClass(cls): 
     testee = Testee() 
     for name, member in inspect.getmembers(object=testee, predicate=inspect.ismethod or inspect.iscoroutine): 
      if len(inspect.signature(member).parameters): 
       print(str(inspect.signature(member).parameters)) 
       setattr(Tester,'test_' + name, member) 
      if inspect.isfunction(member) or inspect.ismethod(member): 
       setattr(Tester,'test_' + name, member) 
      elif inspect.iscoroutinefunction(member): 
       setattr(Tester,'test_' + name, functools.partialmethod(TestInstrument.run_coro, member)) 
      else: 
       print(member) 
     return super().setUpClass() 

    def test_a(self): 
     Tester.testee.a() 

    def test_b(self): 
     Tester.testee.b() 

=============================テストセッションが開始さ========= ====================プラットフォームのWin32 - Pythonの3.5.1、pytest-2.9.2、PY-1.4.31、pluggy-0.3.1 - C: \プログラム ファイルは、\ python35 \ python.exe CACHEDIR:.cache ROOTDIR:C:\テスト、INIFILE: 収集2品目

sandbox.py::Tester::test_aはsandbox.py::Tester::test_bを可決しました============== 0.03秒で渡さ

========================== 2を可決=============

EDIT:私は、py.test検出し、(クラス外)グローバルスコープにsetupClassのコードを移動して自動生成されたテストケースを実行している場合。私の「編集」については詳しく説明し

+0

テストクラスをインスタンス化する場所に投稿してください。また、setattrに 'Tester'の代わりに' cls'を使用してください。 –

+0

@Vincenzzzochiのpy.testは私のためにinstantationを行います。 – goldcode

答えて

0

、一つの選択肢はそうだろう。グローバルコードの実行は副作用や他の微妙なバグにも開放されるため、私はこのソリューションに不満を抱いています。クラスTesterスコープにこれを取得する方法上の任意の提案ですか?

import inspect 
import unittest 
import functools 
def auto_generate_test_cases(Tester, Testee): 
    def run(self, fn): 
     fn(Tester._testee) 
    for name, member in inspect.getmembers(
     object=Testee, predicate=inspect.isfunction or inspect.iscoroutine): 
     if len(inspect.signature(member).parameters) == 1:    
      setattr(Tester,'test_' + name, functools.partialmethod(run, member)) 

class Testee: 
    def __init__(self): 
     self._a = 'a' 
    def a(self): 
     print(self._a) 
    def ab(self, a, b): 
     print('a') 
    def b(self): 
     print('b')  
    def h(self): 
     print('h')  
    async def q(self): 
     print('async q') 
    #... 

    #... 
    def z(self): 
     print('z') 

class Tester(unittest.TestCase): 
    _testee = Testee() 
auto_generate_test_cases(Tester, Testee) 

py.test。出力:

C:\tests>py.test sandbox.py --verbose 
============================= test session starts ============================= 
platform win32 -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- c:\program files\python35\python.exe 
cachedir: .cache 
rootdir: C:\\tests, inifile: 
collected 5 items 

sandbox.py::Tester::test_a PASSED 
sandbox.py::Tester::test_b PASSED 
sandbox.py::Tester::test_h PASSED 
sandbox.py::Tester::test_q PASSED 
sandbox.py::Tester::test_z PASSED 

========================== 5 passed in 0.07 seconds =========================== 
関連する問題