Python unittest计算测试次数

时间:2017-02-17 18:42:21

标签: python python-unittest

这是我第一次玩Python的单元测试来完成学校的作业。我基本上有一个圆形对象,我使用pyunit来确保数据存储正确。

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

例如,我想测试方法是否正常工作,尽管有4个断言语句,但Python只计算以下2个测试。这真的让我措手不及,就像Java的JUnit一样,它会计算断言语句的数量。

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中的“规范”是什么?每个方法只应该有一个断言语句吗?

2 个答案:

答案 0 :(得分:3)

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中存在的两个断言添加单独的测试会给代码增加大量的膨胀,这可能会导致非常奇怪的问题。
  3. 例如,如果str.isupper()会以一种奇怪的方式破坏,那么覆盖这个单一函数的单个unittest就会破坏。但是,如果"FOO""Foo"的两个测试是分开的,则一个测试可能会通过,另一个测试会失败。因此,测试单个函数的功能最好保存在单个单元测试中,并带有多个断言。

    同样适用于test_split方法;检查str.split()是否正常并检查它是否与TypeError密切相关,因此最好在代码中保持密切联系。

    所以,回到你的问题:每个方法可以(有时应该)不止一个断言,因为它可以使代码更简单,更清晰,更少混淆。引用Python的" Zen" (通过在python shell中运行import this找到):"简单比复杂"更好。因此,通过在单个方法中对类似的断言进行分组来保持单元测试的简单性和结构性。

答案 1 :(得分:0)

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

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