续接上一次笔记 Unittest-单元测试2
十一、忽略测试用例
@unittest.skip(“理由”) 直接忽略,给出理由
@unittest.skipIf(判断,”理由”) 符合判断忽略,给出理由
@unittest.skipUnless(判断,”理由”) 不符合判断忽略,给出理由
# 测试用例
@unittest.skip("测试忽略011")
def test01_cs01(self):
print("测试011")
a = 10
@unittest.skipIf(a>2 and a<20,"在2到20之间忽略测试022")
def test01_cs02(self):
print("测试022")
@unittest.skipUnless(a < 2 , "a小于2忽略测试033")
def test01_cs03(self):
print("测试033")
十二、unittest单元框架中的断言
assertEqual(a,b) 断言a==b
assertNotEqual(a,b) 断言a!=b
assertTrue(a) 断言a为真
assertFalse(a) 断言a为假
assertIn(a,b) 断言a在b里面
assertNotIn(a,b) 断言a不在b里面
十三、批量执行用例生成HTML格式的报告
HTMLTestRunner.py 放入python文件夹下的lib文件夹下
import os
import sys
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
# 第一种
# unittest.main()
# 通过测试套件
suite = unittest.TestSuite()
# 执行所有当前目录下的用例
testcases = unittest.defaultTestLoader.discover(os.getcwd(), '*.py')
suite.addTests(testcases)
# unittest.TextTestRunner(verbosity=2).run(suite)
nowtime = time.strftime("%Y-%m-%d %H-%M-%S",time.localtime())
name = open(os.getcwd()+"/"+nowtime+"report.html","wb")
runner = HTMLTestRunner(stream=name,verbosity=2,
title="unittest自动化测试报告",description="报告详情如下:")
runner.run(suite)
保存当前报告到当前目录下生成report.html文件
name = open(os.getcwd()+"/"+nowtime+"report.html","wb")
设置生成报告的标题,保存路径,展示情况等
runner = HTMLTestRunner(stream=name,verbosity=2,
title="unittest自动化测试报告",description="报告详情如下:")
运行生成报告
runner.run(suite)
十四、DDT数据驱动
unittest,ddt
1.为什么需要数据驱动?
数据文件中有11组数据,代码只有一份。代码数据分离,解耦合。
2.驱动模式介绍
数据驱动
关键字驱动(核心:把业务逻辑封装成关键字login,只需要调用login。)
混合驱动模式(关键字驱动+数据驱动):市场主流
行为驱动测试:Lettuce
3.什么是DDT
data driver test 数据驱动测试。特点:可以完美和应用于Unittest框架实现数据驱动。
4.DDT详解
ddt是通过装饰器的形式来调用的。
装饰器:完成一种特定功能的函数(事物)。
在python里面装饰器是以@开头,并且装饰器有两种:类装饰器,函数装饰器。
ddt里面有哪些装饰器:
@ddt(类装饰器,申明当前类使用ddt框架)
@data(函数装饰器,用于给测试用例传递数据)
@unpack(将传输的数据包解包),一般作用与元祖tuple和列表list
@file_data(函数装饰器,可直接读取yaml/json文件)
5.实战@ddt,@data
总结:当传单个值时,所有的类型都可以传,并且用例执行一次。
如果说:@data传入多个值的时候,那么传几个值,那么用例执行几次
6.实战@unpack
如果是数字或者字符串:那么不需要@unpack
如果是元祖和列表的话,那么可以通过@unpack,但是参数的个数必须和解完包后的值的个数一样
如果是集合无法解包
如果是字典,那么可以通过@unpack解包,但是参数的名字和个数必须和字典的键保持一直。
@ddt
class Test(unittest.TestCase):
# python数据类型:数字(int,long,float,complex),字符串,列表list,元祖tuple,集合set,字典dict
@data(("王者","荣耀"),("10","20"))
@unpack
def test01_ceshi(self,args1,args2):
print(args1,args2)
@data(["王者","荣耀"],["10","20"])
@unpack
def test02_ceshi(self,args1,args2):
print(args1,args2)
@data({"name":"王者","age":"18"},{"name":"荣耀","age":"18"})
@unpack
def test03_ceshi(self,name,age):
print(name,age)
if __name__ == '__main__':
unittest.main()
7.DDT项目实战
Python的环境
两种环境:
1.本地(只有一个)
2.虚拟(有N个,每一个项目都有一个虚拟环境)
import os
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
import openpyxl
from ddt import ddt, data, unpack
from selenium import webdriver
# 读取excel
# xlrd,xlwt,openpyxl
def read_excel():
workbook = openpyxl.load_workbook("data1.xlsx")
sheet = workbook["login"]
# print(sheet.max_row, sheet.max_column)
alllist = []
for row in range(2, sheet.max_row + 1):
templist = []
for col in range(1, sheet.max_column + 1):
templist.append(sheet.cell(row, col).value)
alllist.append(templist)
number = len(alllist)
return alllist
@ddt
class Test(unittest.TestCase):
@data(*read_excel())
@unpack
def test_jenkins_login(self, order, username, password):
driver = webdriver.Chrome()
driver.get("http://192.168.2.25/#/login?redirect=%2Findex")
driver.find_element_by_xpath('//*[@id="app"]/div/form/div[1]/div/div/input').clear()
driver.find_element_by_xpath('//*[@id="app"]/div/form/div[1]/div/div/input').send_keys(username)
driver.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div[1]/input').clear()
driver.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div[1]/input').send_keys(password)
driver.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/button').click()
time.sleep(3)
# 断言
self.assertIn("#/index", driver.current_url, msg="用户不存在/密码错误")
if __name__ == '__main__':
testcases = unittest.defaultTestLoader.discover(os.getcwd(), '*.py')
nowtime = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime())
filename = open(os.getcwd() + "/" + nowtime + "report.html", "wb")
runner = HTMLTestRunner(stream=filename, verbosity=2,
title="登录自动化测试报告", description="报告详情")
runner.run(testcases)