5

グラフf()、g()、h()には、同じ問題に対して異なるアルゴリズムを実装するいくつかの関数があります。unittestフレームワークを使用してこれらの関数をユニットテストしたいと思います。

アルゴリズムごとに、いくつかの制約が常に有効である必要があります(空のグラフ、ノードが1つしかないグラフなど)。これらの一般的な制約チェックのコードは複製しないでください。したがって、私が設計を開始したテストアーキテクチャは次のとおりです。

class AbstractTest(TestCase):
  def test_empty(self):
      result = self.function(make_empty_graph())
      assertTrue(result....) # etc..
  def test_single_node(self):
      ...

次に、特定のテストケース

class TestF(AbstractTest):
  def setup(self):
      self.function = f
  def test_random(self):
      #specific test for algorithm 'f'

class TestG(AbstractTest):
  def setup(self):
      self.function = g
  def test_complete_graph(self):
      #specific test for algorithm 'g'

...各アルゴリズムについても同様です

残念ながら、nosetestsは、AbstractTestで各テストを実行しようとしますが、実際のself.functionがサブクラスで指定されているため、機能しません。AbstractTestケースで設定__test__ = Falseしてみましたが、この場合、テストはまったく実行されません(このフィールドは継承されていると思います)。抽象基本クラス(abc.ABCMeta)で試しましたが成功しませんでした。私はMixInについて何の結果もなく読んだことがあります(私はそれについて本当に自信がありません)。

テストコードを因数分解しようとしているのは私だけではないと確信しています。Pythonでそれをどのように行いますか?

ありがとう。

4

1 に答える 1

2

Noseは、正規表現に一致するクラス、またはunittest.TestCaseのサブクラスであるクラスを収集するため、最も簡単な解決策は、これらのいずれも実行しないことです。

class AlgoMixin(object):
  # Does not end in "Test"; not a subclass of unittest.TestCase.
  # You may prefer "AbstractBase" or something else.

  def test_empty(self):
    result = self.function(make_empty_graph())
    self.assertTrue(result)

class TestF(AlgoMixin, unittest.TestCase):
  function = staticmethod(f)
  # Doesn't need to be in setup, nor be an instance attribute.
  # But doesn't take either self or class parameter, so use staticmethod.

  def test_random(self):
    pass  # Specific test for algorithm 'f'.
于 2011-02-21T16:10:35.363 に答える