1

いくつかの引数が必要な単純な関数fun1およびのテストがある場合:fun2

class TestOne(unittest.TestCase):
    def test_func1(self):
        a = 0
        b = 1
        c = 2
        self.assertEquals(c, fun1(a,b))

    def test_fun2(self):
        d = 0
        e = 1
        f = 2
        self.assertEquals(f, fun2(d,e))

fun1 と fun2 の出力を入力として必要とする 3 番目の関数のテスト

class TestTwo(unittest.TestCase):

    def test_fun3(self):
        a = 0
        b = 1
        d = 0
        e = 1
        g = 3
        self.assertEquals(g, fun3(fun1(a,b), fun2(d,e)))

最初の関数の引数を書き直す必要がないようにする最善の方法は何ですか?

4

4 に答える 4

1

いくつかのオプションがあります。

  1. 他のすべての回答は継承を使用したいと思われるため、これを一番上に追加します。このような場合で、各テスト セクションの前にのみ値を設定したい場合は (を使用した各テストではsetUpなく)、次を使用しますsetUpClass

    from unittest import TestCase
    class BaseTest(TestCase):
      def setUpClass(cls):
        cls.a = 0
        cls.b = 1
        cls.c = 2
    
    class TestOne(BaseTest):
      def test_func1(self):
        self.assertEquals(self.c, func1(self.a, self.b))
    
  2. を使用しsetUpます。パラメータを頻繁に変更する場合、これはおそらく最善の解決策ではありません。ただし、基本クラスでセットアップを定義し、継承を使用することもできます (他の人が示唆しているように) 。

    from unittest import TestCase
    class TestingSomething(TestCase):
      def setUp(self):
        self.parameters = [(0, 1), ]
    
      def test_func1(self):
        params = self.parameters[0]
        res = func1(*params)
        self.assertEquals(2, res)
    
  3. ヘルパー関数を定義します。

    from unittest import TestCase
    class TestingSomething(TestCase):
    
      def param_set_one(self):
        return (0, 1), 2
    
      def test_func1(self):
        params, expected = self.param_set_one()
        res = self.obj.func1(*params)
        self.assertEquals(expected, res)
    
  4. おそらく、あなたの質問に対するより具体的な答えは、より具体的なヘルパー関数を使用することです。

    from unittest import TestCase
    class TestingSomething(TestCase):
      def setUp(self):
        self.obj = TestOne()
    
      def param_set(self):
        return (0, 1)
    
      def get_func1(self):
        return self.obj.func1(*self.param_set())
    
      def get_func2(self):
        return self.obj.func2(*self.param_set())
    
      def test_func1(self):
        params = self.param_set()
        res = self.obj.func1(*params)
        self.assertEquals(2, res)
      [...]
      def test_func3(self):
        retval_func1 = self.get_func1_retval()
        retval_func2 = self.get_func2_retval()
        self.assertEqual(3, func3(retval_func1, retval_func2))
    

    テストを別々のクラスにしたい場合は、テスト ケースの外でヘルパー関数を宣言するだけです。

于 2015-05-22T18:32:20.980 に答える
0

別のクラスを作成することもできると思います。私はこれが行われたのを見たことがありますが、実際に行ったことはありません。これが機能することを人々が知っている場合は、コメントを残してください:)私が自分でテストしている間:

class Tests(unittest.TestCase):
    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = 2

class TestOne(Tests):
    def test_func1(self):
        self.a
        self.b
        self.c

class TestTwo(Tests):
    def test_fun3(self):
        self.a
        self.b
        self.c

更新: クラス Tests() の self.a~c を変更すると、TestOne と TestTwo の test_func1 と test_func3 が適切な値を出力します。

于 2013-07-29T19:44:01.983 に答える
-1
from functools import partial

f1 = partial(fun1, a, b)
f2 = partial(fun2, d, e)

呼び出し ( ref ):

f1()
f2()

またはあなたの場合:

f1 = partial(fun1, 0, 1)
f2 = partial(fun2, 0, 1)

例:

In [1]: from functools import partial

In [2]: def fun1(a, b):
   ...:     return a + b
   ...: 

In [3]: f1 = partial(fun1, 0 ,1)

In [4]: f1()
Out[4]: 1
于 2013-07-29T19:41:30.830 に答える