8

私は次のようなテストケースを持っています:

def MyTestCase(unittest.Testcase):
  def test_input01(self):
    input = read_from_disk('input01')
    output = run(input)
    validated_output = read_from_disk('output01')
    self.assertEquals(output, validated_output)
  def test_input02(self):
    input = read_from_disk('input02')
    # ...
  # and so on, for 30 inputs, from input01 to input30

簡潔さよりも単純さが重要であるため、テストコードは少し繰り返しになる可能性があることを理解しました。しかし、ここで使用されている一部の関数のシグネチャを変更することにしたとき、30か所すべてで変更を加えなければならなかったため、これは本当にエラーが発生しやすくなっています。

test_inputxxこれを既知の入力のループにリファクタリングすることもできますが、各入力を個別のテストのままにしておきたいので、メソッドを作成する必要があると思いました。

私は何が間違っているのですか?

4

4 に答える 4

13

テスト ケースから繰り返しを削除するヘルパー関数を記述します。

def MyTestCase(unittest.Testcase):
  def run_input_output(self, suffix):
    input = read_from_disk('input'+suffix)
    output = run(input)
    validated_output = read_from_disk('output'+suffix)
    self.assertEquals(output, validated_output)

  def test_input01(self): self.run_input_output('01')
  def test_input02(self): self.run_input_output('02')
  def test_input03(self): self.run_input_output('03')
于 2012-09-11T02:52:47.417 に答える
2

Ned Batchelder のソリューションが気に入っています。しかし、後世のために、入力の数を頻繁に変更する可能性がある場合は、次のようにすることができます。

def MyTestCase(unittest.Testcase):
    def __init__(self, *args, **kwargs):
        for i in range(1,31):
            def test(self, suffix=i):
                input = read_from_disk('input%02d' % suffix)
                output = run(input)
                validated_output = read_from_disk('output%02d' % suffix)
                self.assertEquals(output, validated_output)
            setattr(self, 'test_input%02d' % i) = test
        super(MyTestCase, self).__init__(*args, **kwargs)
于 2012-09-11T03:01:58.237 に答える
1

どの入力が失敗したかを報告するように、このようなものはどうですか。

def MyTestCase(unittest.Testcase):
  def test_input01(self):
    for i in range(1,30):
      input = read_from_disk('input%.2d' %i)
      output = run(input)
      validated_output = read_from_disk('output%.2d' %i)
      self.assertEquals(output, validated_output, 'failed on test case %.2d' %i)
于 2012-09-11T02:49:18.057 に答える