Python unittest计算测试数

2024-09-29 19:27:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次在学校里玩Python的unittest。我基本上有一个Circle对象,在这里我使用pyunit来确保数据存储正确。在

我注意到Python只计算作为测试用例的方法的数量,而不是assert语句的数量。在

例如,我想测试方法是否正常工作,Python只将以下内容计算为2个测试,尽管有4个assert语句。它确实让我措手不及,因为使用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语句吗?在


Tags: 方法testself数量defassert语句unittest
2条回答

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_isupper和{}都包含两个断言,因为它们非常密切相关。为test_isupper中存在的两个断言添加单独的测试将给代码添加大量膨胀,并且可能导致非常奇怪的问题。在

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

这同样适用于test_split方法;检查str.split()是否工作以及检查它是否引发了TypeError是密切相关的,因此最好在代码中保持紧密联系。在

所以,回到你的问题上来:每个方法可以(有时应该)有多个assert,因为它会导致更简单、更清晰的代码和更少的混乱。引用“Python的Zen”(在pythonshell中运行import this可以发现):“简单比复杂好”。因此,通过在一个方法中对相似的断言进行分组,使您的单元测试保持简单和结构化。在

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

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

相关问题 更多 >

    热门问题