在前面的两个文章中关于接口测试,自动化测试聊了很多,那今天就说下在自动化测试中的断言,在自动化测试中,没有断言的测试用例是无效的,这是我一直的想法,那么怎么样的断言是正确的,一个自动化测试用例增加了断言就可以完全的放心了吗?在自动化测试中,我感觉最可怕的不是测试用例的维护,以及它的编写,最可怕的是功能存在问题,而自动化测试用例执行后,结果竟然是PASS,这会导致很严重的后果和质疑。
既然说到自动化测试断言这部分,就以简单的例子来说明这点,就按UI级别的自动化测试来举例,案例是打开百度首页,验证title是否是“百度一下,你就知道”,见代码:
#!/usr/bin/env python
#coding:utf-8
import unittest
from selenium import webdriver
class UITest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.get('http://www.baidu.com')
self.driver.implicitly_wait(30)
def tearDown(self):
self.driver.quit()
def test_baidu_title(self):
title=self.driver.title
if title==u'百度一下,你就知道':
print ('pass')
else:
print ('fail')
if __name__ == '__main__':
unittest.main(verbosity=2)
针对上面的代码,不管怎么执行,在自动化的测试报告中,该用例永远是pass的,在自动化测试的测试代码中,尽量少使用if这些判断的代码,自动化测试的结果很简单,要么是PASS,要么是FAIL,没有第三种情况,所以也就意味着断言一定要准确,不能出现的结果让人去猜或者是模棱两可的说不清楚,上面代码的问题就在于不管这个判断打印结果是pass还是fail,在自动化测试结果中,这个用例是pass的,不会因为打印的结果是fail,用例执行结果也是fail。另外需要注意的是在测试用例的断言中也不要使用try异常处理的方式,不能说因为执行失败了就去处理异常,如果代码执行失败就应该让失败,通过失败来定位是功能bug还是测试代码写的不对,针对if判断和try异常这些,可以放在对象层中,尽量避免在测试层中。对上面的代码进行修改,见修改后的代码:
#!/usr/bin/env python
#coding:utf-8
import unittest
from selenium import webdriver
class UITest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.get('http://www.baidu.com')
self.driver.implicitly_wait(30)
def tearDown(self):
self.driver.quit()
def test_baidu_title(self):
self.assertEqual(self.driver.title,u'百度一下,你就知道')
if __name__ == '__main__':
unittest.main(verbosity=2)