2017-02-17 94 views
1

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

我注意到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中的“规范”是什么?每个方法是否应该只有一个断言声明?

+1

“与Java的JUnit一样,它会计算断言语句的数量,而不是” - 什么?从何时起? – user2357112

+0

在过去的经验中,只要我有@Test我想测试的上述方法,相应方法中的所有断言语句都会显示在Eclipse的JUnit Testing面板中。例如,一个包含4个以Java编写的断言语句的方法 - 全部四个断言将在Eclipse中显示。 pyunit用Python编写的这些相同的断言,说“Ran 1测试0.001秒,好吧。” –

+1

'pyunit'是第三方测试模块,它与标准库中的CPython自带的'unittest'模块不同。如果你使用'unittest',那么你应该编辑文本来删除'pyunit'和'pyunit'标签。如果您发布了MCVE https://stackoverflow.com/help/mcve,那么您使用的是哪个模块就没有问题。 –

回答

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

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

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

所以,回到你的问题:每个方法都可以(有时应该)多于一个断言,因为它导致更简单,更清晰的代码,并且更少混淆。引用“Python的禅”(通过在python shell中运行import this找到):“简单胜于复杂”。因此,通过用单一方法分组类似的断言,让你的单元测试变得简单和结构化。

0

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

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