前面简单介绍了unittest框架收集与执行测试用例;回顾一下登录用例的代码,如下:
import unittest#导入模块
from Test_login.login import login#导入被测文件
class TestLogin(unittest.TestCase):#定义测试类继承unittest.TestCase类
def setUp(self):#执行每条用例前都会执行
print('每条用例执行前的前置条件')
@classmethod
def setUpClass(cls):#类方法,整个测试类只执行一次前置
print('只执行一次的前置条件')
@classmethod
def tearDownClass(cls):
print('只执行一次的后置条件')#类方法,整个测试类执行一次的后置
def tearDown(self):
print('每条用例执行后的后置条件')#执行每条用例以后都会执行
def test_login_success(self):#登录成功用例
username='admin'
password='123456'
login(username,password)
expected_result={'msg':'登录成功'}#预期结果
actual_result=login(username,password)#调用被测函数
self.assertTrue(expected_result==actual_result)#判断预期结果与实际结果是否一致
def test_login_error(self):#账号或密码错误用例
username='ADMIN'
password='456789'
expected_result={'msg':'账号或密码不正确'}#预期结果
actual_result=login(username,password)
self.assertTrue(expected_result==actual_result)
def test_login_empty(self):#账号或密码为空用例
username=''
password=''
expected_result={'msg':'账号或密码为空'}#预期结果
actual_result=login(username,password)
self.assertTrue(expected_result==actual_result)
if __name__=='__main__':
unittest.main()
发现每个用例方法除了数据不同之外都是一样的,这时候就可以定义一个函数,传入不同的数据就可以代替这些用例方法,以减少代码的重复性;所以需要把数据分离出来,写在excel表格里,通过openpyxl第三方模块去操作excel,拿到想要的数据(上一篇已经写过);
但是如果有多个模块的用例放在excel不同的Sheet里面,那每个用例.py文件里面都需要去重新写一遍获取excel数据的代码。所以为了减少代码量提高代码的复用性这里先把操作excel的方法封装起来,如下:
import openpyxl
class ExcelMethod:
def __init__(self,filepath,sheet):
self.filepath=filepath
self.sheet=sheet
def open_excel(self):#打开文件
workbook=openpyxl.load_workbook(self.filepath)
self.workbook=workbook
return workbook
def get_sheet(self):#获取表单
sheet=self.open_excel()[self.sheet]
return sheet
def get_case(self):#获取数据
rows=list(self.get_sheet().rows)
case_list=[]
title_list=[]
for title in rows[0]:
title_list.append(title)
for row in rows[1:]:
dic={}
for idx,val in enumerate(row):
dic[title_list[idx]]=val.value
case_list.append(dic)
return case_list
def write_excel(self,row,column,data):#写入数据
sheet = self.get_sheet()
sheet.cell(row,column).value=data
self.excel_save()
self.excel_close()
def excel_save(self):#保存excel
self.workbook.save(self.filepath)
def excel_close(self):#关闭excel
self.workbook.close()
在获取数据的时候导入ExcelMethod类,调用里面的方法就行了。
但是用例的方法如何获取这些数据呢?就需要用到第三方模块ddt(data dirven testing),数据驱动测试。
首先安装
pip install ddt
ddt主要包含的组件:
@ddt :用于继续了unittest.TestCase的类装饰器,
@data() :测试类里面的用例方法装饰器,传入测试数据,可以是列表,元组,字典。
使用方法如下:
import ddt
@ddt.ddt
class TestLogin(unittest.Testcase):
pass
@ddt.data(*case)#这里要使用*,因为入参是不定长参数。ddt会自行把数据分解成组形式,每一组即一个用例
def test_login(self,case):
pass
最后来完善一下代码,目录如下:
登录用例:
from Testdemo.demo.login import login
from Testdemo.Methods.excel_method import ExcelMothed#导入封装好的ExcelMothed类
import unittest
import ddt
import os
from Testdemo.Methods.get_path import os_path
case_path=os_path('case.xlsx')
data=ExcelMothed(case_path,'Sheet1')#实例化
case=data.get_case()#调用ExcelMothed类里面的获取用例数据的方法
获取到的用例内容如下:
case=[
{'case_id': 1, 'module': '登录', 'title': '登录成功', 'data': "{'username':'admin','password':'123456'}", 'expected': "{'msg':'登录成功'}"},
{'case_id': 2, 'module': '登录', 'title': '登录失败', 'data': "{'username':'ADMIN','password':'123456'}", 'expected': "{'msg':'账号或密码不正确'}"},
{'case_id': 3, 'module': '登录', 'title': '登录失败', 'data': "{'username':None,'password':None}", 'expected': "{'msg':'账号或密码为空'}"}]
data.excel_close()#关闭excel
@ddt.ddt
class TestLogin(unittest.TestCase):#定义测试类继承unittest.TestCase类
@ddt.data(*case)#分解数据得到每组用例,循环执行。
def test_login(self,case):#登录成功用例方法
info=eval(case['data'])
username=info['username']
password=info['password']
expected_result=eval(case['expected'])#预期结果
actual_result=login(username,password)#调用被测函数
self.assertTrue(expected_result==actual_result)#判断预期结果与实际结果是否一致
注册用例:
from Testdemo.demo.register import register
from Testdemo.Methods.excel_method import ExcelMothed
from Testdemo.Methods.get_path import os_path
import ddt
case_path=os_path('case.xlsx')
data=ExcelMothed(case_path,'Sheet2')
case=data.get_case()
获取到的用例内容如下:
case=[
{'case_id': 1, 'module': '注册', 'title': '注册成功', 'data': "{'phone':'13800138000','code':'1234'}", 'expected': "{'mgs':'注册成功'}"},
{'case_id': 2, 'module': '注册', 'title': '注册失败', 'data': "{'phone':'1123456','code':'1234'}", 'expected': "{'mgs': '手机号或验证码错误'}"},
{'case_id': 3, 'module': '注册', 'title': '注册失败', 'data': "{'phone':None,'code':None}", 'expected': "{'mgs': '手机号或验证码为空'}"}]
data.excel_close()
import unittest
@ddt.ddt
class TestRegister(unittest.TestCase):
@ddt.data(*case)
def test_register(self,case):
info=eval(case['data'])
phone=info['phone']
code=info['code']
expect_result=eval(case['expected'])
actual_result= register(phone, code)
self.assertTrue(expect_result==actual_result)
执行结果:
功力不够,写的有点low!