繁体   English   中英

使用unittest的Python中许多测试用例的正确结构

[英]Proper structure for many test cases in Python with unittest

我正在研究unittest包,并且我不确定在为同一方法编写大量测试用例时构建测试用例的正确方法。 假设我有一个计算数字阶乘的fact函数; 这个测试文件可以吗?

import unittest

class functions_tester(unittest.TestCase):
    def test_fact_1(self):
        self.assertEqual(1, fact(1))
    def test_fact_2(self):
        self.assertEqual(2, fact(2))
    def test_fact_3(self):
        self.assertEqual(6, fact(3))
    def test_fact_4(self):
        self.assertEqual(24, fact(4))
    def test_fact_5(self):
        self.assertFalse(1==fact(5))
    def test_fact_6(self):
        self.assertRaises(RuntimeError, fact, -1)
        #fact(-1)

if __name__ == "__main__":
    unittest.main()

对于一种方法,有这么多测试方法似乎很草率。 我想只有一个测试方法,并放置了大量的基本测试用例(即4!== 24,3!== 6,5!== 120,依此类推),但是unittest不允许你去做。

在这种情况下构建测试文件的最佳方法是什么?

先谢谢您的帮助。

您可以将断言置于循环中:

def test_fact(self):
    tests = [(1,1), (2,2), (3,6), (4,24), (5,120)]
    for n,f in tests:
        self.assertEqual(fact(n), f)

我会说你做这件事的方式一般都很好(但请继续阅读)。

正如interjay建议的那样,你可以做一个循环(顺便说一下,它只算作一个测试,因为unittest模块计算函数的数量,而不是断言的数量)。 但我认为你不会穷尽地尝试在很长的时间间隔内测试每个数字,甚至是所有数字。 所以循环不会为你节省太多,特别是在测试中,你应该以明确为目标。

话虽如此,您应该测试少量后续数字(例如,1到5),然后尝试了解角落情况和失败点的可能性。 比如说,测试10,100,1000(即变化的数量级),负数,零等。

顺便说一句,请注意你最近的两次测试。 第一个并不意味着什么。 事实(5)不同于很多数字(实际上是无限数字)。 测试正确的情况,测试不正确的情况是不高效的。

def test_fact_5(self):
    self.assertFalse(1==fact(5))

第二个名字很糟糕:“test_fact_6”让我觉得你在测试事实(6)。 您应该将其命名为“test_fact_minus_one”,或至少“test_fact_negative_number”。

def test_fact_6(self):
    self.assertRaises(RuntimeError, fact, -1)

测试命名非常重要,无论是在调试错误时还是作为文档返回测试时。

你说你正在寻找进入unittest ,但考虑使用nose试验,而不是-它们允许你以编程方式生成独立的测试用例。

如何在python中生成动态(参数化)单元测试? (回答)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM