繁体   English   中英

Python unittest计算测试数量

[英]Python unittest counting the number of tests

这是我第一次使用Python的单元测试在学校进行作业。 我基本上有一个Circle对象,在这里我使用pyunit来确保数据正确存储。

我注意到,Python仅将方法的数量视为测试用例,而不是assert语句的数量。

例如,我想测试方法是否正常工作,尽管有4条assert语句,Python却仅将以下内容计为2次测试。 确实让我措手不及,因为使用Java的JUnit,它将改为计算assert语句的数量。

def test_xcrd(self): 
    self.assertTrue(self.point.xcrd() == 1) 
    self.assertFalse(self.point.xcrd() == 5)

def test_ycrd(self): 
    self.assertTrue(self.point.ycrd() == 2) 
    self.assertFalse(self.point.ycrd() == 10)

python中的“规范”是什么? 每个方法应该只有一个assert语句吗?

Python的unittest包允许您像注意到的那样用单独的方法构造单元测试。 如果您要测试非常相关的事物并且不需要单独的单元测试,这将很有用。

unittest的测试通过继承开始unittest.Test ,然后添加方法这一点。 因此,您可以在相关性较低的不同单元测试之间添加几层分隔。

Python Docs中的一个示例演示了Python单元测试的最佳实践:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

您可以在这里观察到很多事情:

  1. TestStringMethods的三种方法是单独的单元测试。
  2. test_isuppertest_split都包含两个断言,因为它们关系非常密切。 test_isupper存在的两个断言添加单独的测试会给代码增加很多膨胀,并且可能导致非常奇怪的问题。

例如,如果str.isupper()以一种奇怪的方式中断,则覆盖此单个函数的单个单元测试将中断。 但是,如果针对"FOO""Foo"的两个测试是分开的,则一个测试可能会通过,而另一个则失败。 因此,测试单个功能的功能最好保留在具有多个断言的单个单元测试中。

同样适用于test_split方法; 检查str.split()有效以及检查它是否引发TypeError是密切相关的,因此最好在代码中将它们保持在一起。

因此,回到您的问题:每个方法可以(有时应该)有多个断言,因为它可以导致代码更简单明了,并且混乱更少。 引用“ Zen of Python”(通过在Python shell中运行import this找到import this ):“简单胜于复杂”。 因此,通过在一个方法中将相似的断言分组,可以使单元测试变得简单和结构化。

您的问题的答案'''python中的“规范”是什么? 每个方法应该只有一个assert语句吗?'''是“ No”。 有人可能会说“是”,但是包括我在内的CPython核心开发人员通常在测试方法中使用多个断言。 查看Lib/test中的test_xyz文件(如果您的安装包括该目录)。

的确,一种方法应该测试一个单元甚至一个单元的一种行为。

暂无
暂无

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

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