将参数传递给python unittests测试函数

时间:2015-02-27 06:15:27

标签: python python-unittest

C#的NUnit能够使用不同的参数多次运行相同的测试:

[TestCase(12,2,6)]
[TestCase(12,4,3)]
public void DivideTest(int n, int d, int q) {
  Assert.AreEqual( q, n / d ); 
} 

是否可以在Python的unittest模块中执行相同的操作?

我可以选择

def test_divide(self):
   for n, d, q in [(12, 2, 6), (12, 4, 3)]:
     self.assertEqual(q, n / d)

但是

  • 在错误时不打印n,d,q的值,
  • 第一次失败会中断整个测试,NUnit会选择其他参数并继续测试。

1 个答案:

答案 0 :(得分:0)

Python没有用于添加此类测试的快捷语法,但可以将测试动态添加到unittest类。

根据您提供的示例,您可以按以下方式执行此操作:

import os
import unittest


class TestMath(unittest.TestCase):
    pass


def add_method(cls, method_name, test_method):
    """
    Add a method to a class.
    """
    # pylint warns about re-defining the method name, I do want to re-define
    # the name in this case.
    # pylint: disable=W0622
    test_method.__name__ = method_name
    if not hasattr(cls, test_method.__name__):
        setattr(cls, test_method.__name__, test_method)


def add_divide_test(n, d, q):
    """
    Adds a test method called test_divide_n_by_d to the TestMath class that
    checks the result of the division operation.
    """

    def test_method(self):
        self.assertEqual(q, n / d)

    add_method(
        TestMath, "test_divide_%d_by_%d" % (n, d), test_method
    )

# Adding an entry to this list will generate a new unittest in the TestMath
# class
value_list = [
    [12, 2, 6],
    [12, 4, 3],
]

for values in value_list:
    add_divide_test(values[0], values[1], values[2])

如果要根据目录中的文件列表生成单元测试,这将变得非常有用。例如,您可以在test_resources中拥有一组数据文件,并实现类似的内容。

for file_name in os.listdir("test_resources"):
    add_test_for_file(file_name)

设置为添加新的unittest后,您只需在test_resources目录中添加新文件即可添加新测试