一、装饰器
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。
于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
1.用setUp与setUpClass区别
setup():每个测试case运行前运行
teardown():每个测试case运行完后执行
setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次
tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次
执行顺序
from selenium import webdriver import time import unittest class BaiDu(unittest.TestCase): @classmethod def setUpClass(cls): print("开始运行类方法") @classmethod def tearDownClass(cls): print("结束运行类方法") def setUp(self): #前置处理,每条用例运行前都会运行setup内容 print("开始运行用例") def tearDown(self):#后置处理,每条用例运行后都会运行teardown内容 print("结束运行用例") def test_01(self):#用例01 print("用例1") def test_02(self):#用例02 print("用例2") if __name__=='__main__': # 方法一,执行所有用例 unittest.main()
结果--
开始运行类方法开始运行用例
用例1
结束运行用例
开始运行用例
用例2
结束运行用例
结束运行类方法
二、断言
在测试用例中,执行完测试用例后,最后一步是判断测试结果是pass还是fail,自动化测试脚本里面一般把这种生成测试结果的方法称为断言(assert)。
用unittest组件测试用例的时候,断言的方法还是很多的,下面介绍几种常用的断言方法:assertEqual、assertIn、assertTrue
基本断言方法
基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
语法:self.assertEqual(first,second,msg='testcase error!')
序号 断言方法 断言描述
1 assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail
2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail
4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail
6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail
7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
8 assertIsNotNone(expr, msg=None) 验证expr不是None,是则fail
9 assertIn(arg1, arg2, msg=None) 验证arg1是arg2的子串,不是则fail
10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail
11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail
12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail
三、自动生成HTML报告
批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。
unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner.py(放到python的lib目录下面)
unittest不能自动发送邮箱,需要导入邮箱的模块,Email.py(放到项目目录下)
语法:
#批量执行脚本文件 import unittest import time from HTMLtestRunner import HTMLTestRunner import Email case_path=r'D:\pych\pycunchu\_ui_selenium\run_unin' dis=unittest.defaultTestLoader.discover(start_dir=case_path,pattern="unin0*.py") nowTime=time.strftime('%Y-%m-%d-%H-%M-%S')#更新的报告更名为匹配时间格式的HTML文件 reportname=nowTime + 'report.html'#时间加报告名称 dir=open(reportname,'wb') runner=HTMLTestRunner(stream=dir,title='百度搜索ui测试',tester='zhangsan',description='用例执行情况如下:') runner.run(dis) email=Email.Sum_Mail(reportname,reportname) email.send_mail()