如何动态添加测试到python unittest

时间:2012-05-22 03:59:30

标签: python unit-testing

我想设置一个不知名的TestCase,其中一些案例是动态添加的。这些方法是从我的testnothing中添加的,但是,unittest不考虑它们,因为它只运行一次测试,就像我构建我的test_xxxx太晚而没有考虑到。 setUpClass是否在游戏后期执行?我应该在__init__构建我的方法中,然后调用super().__init__吗?

import unittest
import blognodes

class Test_base62(unittest.TestCase):
  testset = { 0: '0', 10: 'a', 61: 'Z', 62: '10', 3844: '100'}

  @classmethod
  def setUpClass(cls):
    cls.testme = 5
    print("i am the setUp function")
    for d, b62 in cls.testset.items():
      print("building the first set")
      cls.build_test_base62_values(d, b62)
      print("building the second set")
      cls.build_test_int_values(d, b62)


  @classmethod
  def build_test_base62_values(cls, d, b62):
    def f(cls):
      target = blognodes.base62(d)
      cls.assertEqual(target.str(), b62)
    fname = "test_base62_value_{}".format(d)
    setattr(cls, fname, f)

  @classmethod
  def build_test_int_values(cls, d, b62):
    def f(cls):
      target = blognodes.base62(d)
      cls.assertEqual(target.int(), d)
    fname = "test_int_value_{}".format(d)
    setattr(cls, fname, f)

  def test_nothing(self):
    print("i'm test nothing")
    t = dir(self)
    print(t)
    self.assertEqual(5, self.testme)

感谢。

1 个答案:

答案 0 :(得分:4)

问题是来自unittest的加载器在实例化之前在类上运行dir(),因此,创建方法的位置无关紧要__new____init__,{ {1}}等等......方法创建得太迟了。

有两种方法可以解决这个问题,编写自己的run()方法或使用元类。前者意味着您必须重新编写已经在unittest中编写的发现。实现的元类实际上并不复杂。这是我做的:

setUpClass