单元测试异常捕获

关于自动化测试执行期间断言的异常的选择迷茫

大概是这段时间有点压抑,昨天下午就不知道怎么钻在了单元测试断言失败需不需要捕获异常这个问题上。
大家都知道,进行单元测试时,加入断言验证单元测试结果,断言失败会报错,通过会打印ok标识。

nose进行单元测试

使用nose进行单元测试示例:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nose.tools import assert_equal

def test_sum():
a = 1
b = 2
res = 5
assert_equal(res, a+b)

控制台执行

1
nosetests -v -s Testexec.py

打印信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Testexec.test_sum ... FAIL

======================================================================
FAIL: Testexec.test_sum
----------------------------------------------------------------------
Traceback (most recent call last):
File "g:\skills\python36\lib\site-packages\nose\case.py", line 198, in runTest
self.test(*self.arg)
File "G:\workstation\py_workstation\DataDriverTest\Testexec.py", line 17, in test_sum
assert_equal(res, a+b)
AssertionError: 5 != 3

----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (failures=1)

可以看出,断言失败了,控制台也打印出了断言失败的信息。但是在进行自动化测试过程中,如果你想加入日志模块,在执行过程中就在控制台或者文件中打印日志,例如:Testexec.test_sum ... 断言失败,3不等于5这样的信息,很明显,直接用上述写法是不会走到打印失败信息这一步,所以就需要将断言失败的异常捕获,类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nose.tools import assert_equal

def test_sum():
try:
a = 1
b = 2
res = 5
assert_equal(res, a+b)
except AssertionError as e:
print("断言失败,{0}不等于{1}".format(a+b, res))

这种写法执行单元测试,结果:

1
2
3
4
5
6
7
8
{lamb} nosetests -v -s Testexec.py
Testexec.test_sum ... 断言失败,3不等于5
ok

----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

可以看见在断言失败的情况下,打印出了自定义的断言失败信息,这样也就满足进行自动化测试时,实时有日志生成,方便查看,但是这样有个问题,你一旦把断言失败的异常捕获了,那该条测试执行结果就是OK状态,到最后统计时候就不容易看出是哪条执行失败了,只能查看日志;而且日志中也没有展示具体在哪一行有报错,所以这样的方式需要改进。

打印堆栈信息

在断言失败时,把异常捕获,此时不会展示具体断言错误的信息,所以就需要添加堆栈信息打印:

1
2
3
4
5
6
7
8
9
def test_sum():
try:
a = 1
b = 2
res = 5
assert_equal(res, a+b)
except AssertionError as e:
logging.error("断言失败,{0}不等于{1}".format(a+b, res) +
str(traceback.print_exc())

这样就可以获取堆栈信息,可以查看具体哪一行有报错,但是,这样堆栈的日志也只会打印在控制台上,不利于查看,好traceback.print_exc()可以指定日志输出路径,所以只需要修改为:

1
2
3
4
5
6
7
8
9
def test_sum():
try:
a = 1
b = 2
res = 5
assert_equal(res, a+b)
except AssertionError as e:
logging.error("断言失败,{0}不等于{1}".format(a+b, res) +
str(traceback.print_exc(file=open('test.log', 'a'))))

这样就可以完成,错误日志打印到文件中,其中a表示append。

邮件附件

在进行自动化测试时,我们经常不仅需要日志文件,更多用到的是测试报告,在自动化用例执行完成之后以邮件形式发送到指定邮箱,只需要查看邮件的附件,就可以知晓用例执行情况;但是使用unittest或者nose时,一旦把断言异常捕获,那该条用例结果就是ok状态,实际上我们知道这条用例其实是执行失败了,这样,使用HTMLTestRunner或者是nosetests --with-html --html-file生成的html文件中,用例执行状态就都是success状态,很显然是不正确的。

所以我考虑的是,自己写自定义的测试报告样式,定义一个状态标志status,初始状态为success,在用例执行过程中,一旦捕获了断言异常,就将状态更新为fail,在测试报告中,执行结果栏展示的是该状态,这样就可以实现结果查看了。

自定义测试报告样式。。现在还是只有这个想法,未完待续,待实现了再来更新!(前端知识匮乏啊,越来越觉得自己弱。。。)

断言捕获,可以生成日志,在屏幕和日志文件中打印显示,但是,这样,所有的单元测试都是通过状态,没有一条fail;

断言不捕获,直接邮件发送结果,可以在邮件中看出具体哪条用例执行失败,可以点开失败,查看具体失败信息

文章目录
  1. nose进行单元测试
  2. 打印堆栈信息
  3. 邮件附件
|