断言失败后如何继续进行单元测试?

时间:2016-04-18 00:17:36

标签: python unit-testing python-3.x

我想在testIdPropery中执行第二个断言,无论第一个断言是否通过。如果不在第一个断言周围放置try / except块,我怎么能这样做呢?这是代码:

class BlockTests(unittest.TestCase):
    def setUp(self):
        self.city1 = City(1, "New York")
        self.city2 = City(2, "Boston")

    def tearDown(self):
        self.city1 = None

    def testIdProperty(self):
        self.assertEqual(2, self.city1.id_city, "Assertion Error!") #This assert might fail
        self.assertEqual(2, self.city2.id_city, "Assertion Error!") #Execute this anyway

    def testIdGetter(self):
        self.assertEqual(1, self.city1.get_id_city(), "Error!")

目前,如果第一个断言失败,则测试用例立即报告失败,第二个断言永远不会运行。

3 个答案:

答案 0 :(得分:1)

从您的测试中,您似乎正在尝试测试类id的{​​{1}}属性。因此,您可以测试在City定义的那两个实例具有正确的值集 - 与您的操作类似:

setUp

现在当你运行这个测试时,它应该通过。如果有一天你破坏了你的代码并且这两个断言中的一个失败了,你想在运行测试并修复它时看到它。

但是,如果由于某种原因你不希望这些断言暂时失败,直到你以后再回来完成测试,那么你可以跳过这样的测试:

def testIdProperty(self):
    self.assertEqual(1, self.city1.id_city, "Fail if City1 does not have id 1")
    self.assertEqual(2, self.city2.id_city, "Fail if City2 does not have id 2")

编辑:如果您想要抑制失败断言的错误,请不要在您需要的每个地方尝试/除外。最好在测试类之外编写泛型函数:

@unittest.skip("skip this test im not done writing it yet!")
def testIdProperty(self):
    self.assertEqual(1, self.city1.id_city, "Fail if City1 does not have id 1")
    self.assertEqual(2, self.city2.id_city, "Fail if City2 does not have id 2")

让这个调用你的断言,所以它会运行代码并且只有在失败时才会静默打印错误:

def silent_assert(func, *args, **kwargs):
    try:
        func(*args, **kwargs)
    except Exception as exc:
        print exc.message

您将能够在其上调用任何断言并传递每个接受的任意数量的参数。不确定隐藏这样的错误是不是一个好主意,我从来不必这样做,但那只是我,每个人都有自己的组织风格!

答案 1 :(得分:0)

如何使用assertRaises

def testIdProperty(self):
    with self.assertRaises(SomeError):
        self.assertEqual(2, self.city1.id_city, "Assertion Error!")
    self.assertEqual(2, self.city2.id_city, "Assertion Error!")

答案 2 :(得分:0)

如果您要进行多个检查,并且始终希望运行所有检查,则最简单的解决方案是将它们分解为多个测试,并使每个测试用例都只有一个检查:

class BlockTests(unittest.TestCase):
    def setUp(self):
        self.city1 = City(1, "New York")
        self.city2 = City(2, "Boston")

    def tearDown(self):
        self.city1 = None

    def testIdPropertyCity1(self):
        self.assertEqual(2, self.city1.id_city, "Assertion Error!") #This assert might fail

    def testIdPropertyCity2(self):
        self.assertEqual(2, self.city2.id_city, "Assertion Error!") #Execute this anyway

    def testIdGetter(self):
        self.assertEqual(1, self.city1.get_id_city(), "Error!")