实验:Unittest核心API(二)
作者:强官涛   类型:Python开发    类别:实验   日期:2019-01-15    阅读:639 次   消耗积分:0 分


注:本节教材内容,与上期推送的《教材连载:Unittest核心API(一)》为一个章节。

回顾上节内容,请点击:教材连载:Unittest核心API(一)


2.断言


TestCase类中提供了丰富的断言去检查和报告错误,下面的表格中列出了最常用的一些方法。第一列代表使用方式,第二列代表检查项,第三列代表开始引入的版本号。前面的例子已经介绍过assertEqual(a,b)的用法,作用是对比参数a和b,相等则通过,反之测试不通过。


Method

Checks that

New in

assertEqual(a, b)

a == b


assertNotEqual(a, b)

a != b


assertTrue(x)

bool(x) is True


assertFalse(x)

bool(x) is False


assertIs(a, b)

a is b

3.1

assertIsNot(a, b)

a is not b

3.1

assertIsNone(x)

x is None

3.1

assertIsNotNone(x)

x is not None

3.1

assertIn(a, b)

a in b

3.1

assertNotIn(a, b)

a not in b

3.1

assertIsInstance(a, b)

isinstance(a, b)

3.2

assertNotIsInstance(a, b)

not isinstance(a, b)

3.2


下面展示了assertTrue方法的源码,可以看到有两个参数,expr为表达式,当表达式结果为True时,测试通过,反之不通过,第二个参数msg为断言失败后用户自定义输出的信息,默认值为None,即默认无输出。


    def assertTrue(self, expr, msg=None):

        """Check that the expression is true."""

        if not expr:

            msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))

            raise self.failureException(msg)


下面是使用assertTrue的简单实例。“1==10”是一个表达式,结果为False,会导致断言失败。


import unittest

class TestDemo(unittest.TestCase):

    def test01(self):

        self.assertTrue(1==10,msg='This is a test msg.')

if __name__ == '__main__':

    unittest.main()


运行结果如下。可以看到断言失败的情况下,输出了“This is a test msg.”。事实上每个断言的方法都有msg参数,灵活的使用此参数可以在测试失败时向团队提供更多的信息和线索。


F

=====================================================================

FAIL: test01 (__main__.TestDemo)

---------------------------------------------------------------------

Traceback (most recent call last):

  File "C:/Users/Administrator/PycharmProjects/python364/C03_Unittest/Ex02_RunTest/Test03.py", line 22, in test01

    self.assertTrue(1==10,msg='running msg.')

AssertionError: False is not true : This is a test msg.

 

---------------------------------------------------------------------

Ran 1 test in 0.001s

FAILED (failures=1)


再比如assertIsInstance(a,b)。从字面意思理解为判断实例,即a如果为b实例出来的对象,则结果为True,否则为False。下面的例子中定义了三个类,TestDemo为测试类,继承于unittest.TestCase,内部有两个测试方法,每个方法均先实例化一个对象,再判断该对象和某个类的关系。


import unittest

class Demo1:

    pass

class Demo2:

    pass

class TestDemo(unittest.TestCase):

    def test01(self):

        d = Demo1()

        self.assertIsInstance(d,Demo1,msg='## This is test01. ##')

    def test02(self):

        d = Demo2()

        self.assertIsInstance(d,Demo1,msg='## This is test02. ##')

if __name__ == '__main__':

    unittest.main()


很容易看出,由于对象d不是Demo1实例化出来的,所以test02测试不通过。


.F

=====================================================================

FAIL: test02 (__main__.TestDemo)

---------------------------------------------------------------------

Traceback (most recent call last):

  File "C:/Users/Administrator/PycharmProjects/python364/C03_Unittest/Ex02_RunTest/Test04.py", line 16, in test02

    self.assertIsInstance(d,Demo1,msg='## This is test02. ##')

AssertionError: <__main__.Demo2 object at 0x01B27570> is not an instance of <class '__main__.Demo1'> : ## This is test02. ##

---------------------------------------------------------------------

Ran 2 tests in 0.001s

FAILED (failures=1)


在unittest框架中,assert断言的方法远远不止以上所述,但核心的原理和用法都是相通的,所以我们不必记住每一个方法,在充分理解的基础上,多查找相关资料并运用到实践中。

 

3.其他


最后一类API提供了错误上报、用例查询等功能,这里先做简单的介绍,后面我们会结合项目来实际运用这些方法。

 

(1)fail(msg=None):无条件声明一个测试用例失败,msg是失败信息。

(2)failureException(msg):是unittest.TestCase的属性,用来表示失败的异常,默认被赋值为AssertionError。

(3)longMessage:默认被赋值为False,如果赋值为True,可以在结果中包含更详细的diff信息。

(4)maxDiff:默认长度80*8,用来控制diff显示的长度。

(5)countTestCases():返回测试用例的个数,对于TestCase实例来说,这个返回值一直是1.

(6)defaultTestResult():如果在run()方法中未提供result参数,该函数返回一个包含本用例测试结果的TestResult对象。

(7)id():返回测试用例的编号,通常是如下格式:模块名.类名.函数名。可以用于测试结果的输出。

(8)shortDescription():返回测试用例的描述,即函数的docstring,如果没有,返回None。可以用于测试结果输出中描述测试内容。

(9)addCleanup(function, *args, **kwargs):添加针对每个测试用例执行完tearDown()方法之后的清理方法,添加进去的函数按照后进先出(LIFO)的顺序执行,当然,如果setUp()方法执行失败,那么不会执行tearDown()方法,自然也不会执行addCleanup()里添加的函数。

(10)doCleanups():无条件强制调用addCleanup()添加的函数,适用于setUp()方法执行失败但是需要执行清理函数的场景,或者希望在tearDown()方法之前执行这些清理函数。


下周推送:Unittest高级应用




为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20181009_153045_341.jpg



版权所有,转载本站文章请注明出处:蜗牛学院在线课堂, http://www.woniuxy.com/note/263
上一篇: 访谈:16年毕业,从矿物勘察转行Java开发,入职月薪8.5K
下一篇: 资讯:春节“防催婚指南”,单身人士请务必收好!
提示:登录后添加有效评论可享受积分哦!