第一个文件:test_cases.py
# ==========================
# @time:2019/10/29 20:01
# @Author:coco
# @File:test_cases.py
# @software:PyCharm
# ============================
import time
import unittest
from register import register
from read_excle02 import ReadExcle
from py23_15day.test_project.ddt import ddt, data
"""
ddt:能够实现数据驱动,通过用例用例数据,自动生成测试用例
自动遍历数据,自动生成测试用例
每遍历一条用例数据,会录成一个参数,传到生成的用例中去
"""
@ddt
class RegisterTestCase(unittest.TestCase):
excle = ReadExcle("cases.xlsx", 'register')
cases = excle.read_data_obj()
@data(*cases)
def test_register(self, case):
# 第一步 准备用例数据
# 获取用例的行号
row = case.case_id + 1
# 获取预期结果
excepted = eval(case.excepted)
# 获取用例入参
data = eval(case.data)
# 第二步 调用功能函数
res = register(*data)
# 第三步 比对预期结果和实际结果
try:
self.assertEqual(excepted, res)
except AssertionError as e:
self.excle.write_data(row=row, column=5, value='未通过')
raise e
else:
self.excle.write_data(row=row, column=5, value='通过')
第二个文件:run_test.py
# ==========================
# @time:2019/11/3 11:14
# @Author:coco
# @File:run_test.py
# @software:PyCharm
# ============================
import unittest
import test_cases
from HTMLTestRunnerNew import HTMLTestRunner
# 创建测试套件
suite = unittest.TestSuite()
# 加载用例到套件
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(test_cases))
with open('zy_report.html', 'wb') as fb:
# 创建测试运行程序
runner = HTMLTestRunner(stream=fb,
title='我的测试报告',
description='案例运用',
tester='coco')
# 执行测试用例
runner.run(suite)
第三个文件:register.py
# ==========================
# @time:2019/10/28 20:10
# @Author:coco
# @File:register.py
# @software:PyCharm
# ============================
users = [{'user': 'python23', 'password': '1123456'}]
def register(username, password1, passwrod2):
# 注册功能
for user in users: # 遍历出所有的账号,判断账号是否存在
if username == user['user']:
# 账号存在
return {"code": 0, "msg": "该账号已存在"}
else:
if password1 != passwrod2:
# 两次密码不一致
return {"code": 0, "msg": "两次密码不一致"}
else:
# 账号不存在,密码重复,判断账号密码长度是否在6-18位之间
if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18:
# 注册账号
users.append({'user': username, 'password': passwrod2})
return {"code": 1, "msg": "注册成功"}
else:
# 账号密码长度不对,注册失败
return {"code": 0, "msg": "账号和密码必须在6-18位之间"}
第四个文件:read_excle02.py
# ==========================
# @time:2019/10/30 21:27
# @Author:coco
# @File:read_excle02.py
# @software:PyCharm
# ============================
import openpyxl
class CaseData:
"""测试用例数据类,专门用来存放数据的"""
pass
class ReadExcle(object):
def __init__(self, filename, sheetname):
self.filename = filename
self.sheetname = sheetname
def open(self):
"""打开工作表和表单"""
self.wb = openpyxl.load_workbook(self.filename)
self.sh = self.wb[self.sheetname]
def read_data(self):
"""读取数据的方法"""
# 打开工作薄和表单
self.open()
# 将表单中的内容,按行获取所有的格子
rows = list(self.sh.rows)
# 创建一个空列表,用例存放所有的用例数据
cases = []
# 获取表头,放到一个列表中
title = [c.value for c in rows[0]]
# 获取除表头以外的其他行中的数据
for r in rows[1:]:
# 每遍历一行,创建一个列表,用例存放该行的数据
data = [c.value for c in r]
# 将表头和该行的数据进行聚合打包,转换字典
case_data = dict(zip(title, data))
# 将该行的用例数据加入到cases这个列表中
cases.append(case_data)
# 关闭工作薄
self.wb.close()
# 将读取好的数据返回出去
return cases
def read_data_obj(self):
"""读取数据的方法,数据返回的是列表嵌套对象的形式"""
# 打开工作薄和表单
self.open()
# 将表单中的内容,按行获取所有的格子
rows = list(self.sh.rows)
# 创建一个空列表,用例存放所有的用例数据
cases = []
# 通过列表推导式获取表头,放到一个列表中
title = [c.value for c in rows[0]]
# 获取除表头以外的其他行中的数据
for r in rows[1:]:
# 通过列表推导式,获取该行的数据,放到一个列表中,该行的数据
data = [c.value for c in r]
# 创建一个用例数据对象
case = CaseData()
# 将表头和该行的数据进行聚合打包,然后进行遍历
for i in zip(title, data):
# 通过反射机制将表头设为对象属性,对应值设为对象的属性值
setattr(case, i[0], i[1])
# 将该行的用例数据加入到cases这个列表中
cases.append(case)
# 关闭工作薄
self.wb.close()
# 将读取好的数据返回出去
return cases
def write_data(self, row, column, value):
"""写入数据"""
# 打开工作薄和表单
self.open()
# 写入内容
self.sh.cell(row=row, column=column, value=value)
# 保存文件
self.wb.save(self.filename)
# 关闭工作薄
self.wb.close()
if __name__ == '__main__':
read = ReadExcle('cases.xlsx', 'register')
# 读取
# data = read.read_data_obj()
# print(data)
# read.write_data(2, 4, '通过')
# read.write_data(3, 4, '未通过')