计算测试数量的Python unittest

计算测试数量的Python unittest,python,python-unittest,Python,Python Unittest,这是我第一次在学校的作业中玩Python的单元测试。我基本上有一个圆形对象,在这里我使用pyunit来确保数据正确存储 我注意到Python只计算作为测试用例的方法的数量,而不是断言语句的数量 例如,我想测试方法是否正常工作,Python只将以下测试计算为2个测试,尽管有4个assert语句。它真的让我措手不及,就像Java的JUnit一样,它将计算断言语句的数量 def test_xcrd(self): self.assertTrue(self.point.xcrd() == 1)

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

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

例如,我想测试方法是否正常工作,Python只将以下测试计算为2个测试,尽管有4个assert语句。它真的让我措手不及,就像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中的“规范”是什么?每个方法是否应该只有一个assert语句?

Python的
unittest
包允许您在不同的方法中构造单元测试,就像您所注意到的那样。这在您想要测试密切相关且不需要单独的单元测试的情况下非常有用

unittest
测试首先对
unittest.Test进行子类化,然后向其中添加方法。因此,您可以在相关程度较低的不同单元测试之间添加多个层分隔

来自的示例演示了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()
在这里,您可以观察到以下几点:

  • TestStringMethods
    的三种方法是单独的单元测试
  • test\u isupper
    test\u split
    都包含两个资产,因为它们关系非常密切。为
    test\u isupper
    中的两个断言添加单独的测试将给代码增加大量膨胀,并可能导致非常奇怪的问题 例如,如果
    str.isupper()
    以一种奇怪的方式中断,那么覆盖此单个函数的单个单元测试将中断。但是,如果
    “FOO”
    “FOO”
    的两个测试是分开的,则一个测试可能通过,另一个测试可能失败。因此,测试单个函数的功能最好保存在具有多个断言的单个unittest中

    这同样适用于
    test\u split
    方法;检查
    str.split()


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

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


    一个方法应该测试一个单元的一个单元甚至一个行为,这是真的。

    “与Java的JUnit一样,它将计算assert语句的数量,而不是“-什么?”?从什么时候开始?在过去的经验中,只要我有@Test以上我想要测试的方法,相应方法中的所有断言语句都将显示在Eclipse的JUnit测试面板中。例如,一个方法有4个用Java编写的断言语句——所有4个断言都将在Eclipse中显示。这些用Python编写的断言,使用pyunit,表示“在0.001s中运行了1个测试,OK。”
    pyunit
    是第三方测试模块,与标准库中随CPython提供的
    unittest
    模块不同。如果使用的是
    unittest
    ,则应编辑文本以删除
    pyunit
    pyunit
    标记。如果您发布了一个MCVE,那么您使用的是哪一个模块就毫无疑问了。@TerryJanReedy请求对此有所不同?也就是说,
    unittest
    有时被称为PyUnit。这一部分已经在Python3的文档中消失了……unittest似乎是在Junit之后作为第三方模块pyunit开始的。该页面和单独发布的版本,最后一次更新是在2001年,有点像化石。stdlib中的Unittest已经看到了许多修复和更新,并且有一个不同的主要维护者。