项目的工程目录:
- py_53 --根目录
- py_api --子目录
- day18_项目框架搭建 --项目工程目录
- common —公用模块
- excle.py -获取Excel表单的数据
- handler_log.py -日志的封装
- config --配置模块
- setting.py -相关文件的配置
- init.py
- conf_ini --配置模块
- d1_ini.ini
- d2_ini文件读取.py
- data --用例读取模块
- case.xlsx
- logs --日志模块
- py53.log
- reports --case报告模块
- report.html
- tests --用例模块
- test_register.py
- test_login.py
- unitcase
- test_excel.py
main.py --主程序入口
总结.md
init.py
- test_excel.py
- common —公用模块
- day18_项目框架搭建 --项目工程目录
- py_api --子目录
day_18项目框架搭建
- api
* helper.py
* __init__.py
- common
* headler_excel.py
* headler_log.py
- conf_ini
* d1_ini.ini
* d2_ini文件读取.py
- data
* case.xlsx
- logs --日志模块
* py53.log
- reports --case报告模块
* report.html
- tests --用例模块
* test_register.py
* test_login.py
- unitcase
* test_excel.py
main.py --主程序入口
总结.md
__init__.py
# helper.py
def login(username, passwd):
"""业务"""
# 到底怎么才能去访问接口
"""登录功能。 开发写的接口"""
response = {"message": None,
"code": None,
"token": None}
if username == 'kino' and passwd == '123456':
response['message'] = 'success'
response['code'] = 200
response['token'] = "good token"
return response
if username == '':
response['message'] = '用户名为空'
response['code'] = 400
return response
if passwd == '':
response['message'] = '密码为空'
response['code'] = 400
return response
else:
response['message'] = '用户名或密码错误'
response['code'] = 400
return response
# hander_excel.py
import openpyxl
from openpyxl.worksheet.worksheet import Worksheet
def read_excel_dict(file, sheet_name="Sheet1"):
"""读取excel"""
# 打开文件
workbook = openpyxl.load_workbook(file)
# 选择表单,表格 Sheet1
sheet: Worksheet = workbook[sheet_name]
data = list(sheet.values)
title = data[0]
rows = data[1:]
data = [dict(zip(title, row)) for row in rows]
return data
if __name__ == '__main__':
# 1,当你想测试这个模块功能的时候,单独来点击播放件,执行下面的测试代码。
# 2,当其他模块调用这个模块时候,下面的测试代码就不会执行了。
# 模块当中就是只有各种定位,函数,类
fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
data = read_excel_dict(fspath)
print(data)
# handler_log.py
from loguru import logger
from py_api.day18_项目框架搭建.config.setting import Config
logger.add(Config.LOG_FILE, encoding='utf-8')
# d1_ini.ini
[default]
host=http://www.yuz.com
hobby=[1,2,3]
[db]
host=http://www.yuzwang.com
port=3306
name="py"
connected=true
# d2_ini文件读取.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('d1_ini.ini', encoding='utf-8')
# 读取配置项
host = parser.get('default', 'host')
print(host)
port = parser.get('db', 'port')
print(port)
print(type(port))
hobby = parser.get('default', 'hobby')
print(hobby)
print(type(hobby))
# setting.py
class Config:
# 域名
HOST = 'http://example.com'
# 端口
PORT = 8080
# 测试用例文件名
CASE_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
# log 存储的文件
LOG_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/logs/py53.log'
# case.xlsx
# py53.log
2022-09-05 17:45:46.586 | INFO | test_login_8:test_login:28 - 正在测试...
2022-09-05 17:45:46.587 | ERROR | test_login_8:test_login:39 - {'message': 'success', 'code': 200, 'token': 'good token'} != None
2022-09-05 17:45:46.588 | INFO | test_login_8:test_login:28 - 正在测试...
# report.html
# test_login.py
import unittest
from py_api.day18_项目框架搭建.api.helper import login
from py_api.day18_项目框架搭建.common.excel import read_excel_dict
from unittestreport import ddt, list_data
from py_api.day18_项目框架搭建.common.log_handler import logger
from py_api.day18_项目框架搭建.config.setting import Config
# 从配置文件倒入用例文件
data_file = Config.CASE_FILE
cases = read_excel_dict(data_file, "Sheet1")
@ddt
class TestLogin(unittest.TestCase):
@list_data(cases)
def test_login(self, case):
# 获取参数
data_str = case['data']
logger.info("正在测试...")
# 字符串要转成字典
data = eval(data_str)
# 把单元(被函数) 改成被测接口, 接口访问过程
actual = login(data['username'], data['passwd'])
expected = case['expected']
expected = eval(expected)
try:
self.assertEqual(expected, actual)
except AssertionError as e:
logger.error(e)
raise e
# test_excel
from py_api.day18_项目框架搭建.common.excel import read_excel_dict
def test_excel():
fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
data = read_excel_dict(fspath)
print(data)
# main
# 主程序
import unittest
import unittestreport
# 填入开始目录, 符合规则的用例会被自动收集
suit = unittest.defaultTestLoader.discover('tests')
print(suit)
# 运行
# result = unittest.TextTestRunner().run(suit)
# print(result)
# 定制化的运行器和测试报告。
runner = unittestreport.TestRunner(suit,
title='项目测试报告',
tester='Memory.荒年〆',
desc="企业专用项目",
templates=2
)
runner.run()
- case.xlsx
- report.html
总结
项目框架搭建(面试题)
目标:执行接口自动化测试
- 必须要支持可以编写自动化用例(测试函数) DONE
- 用例数据,Excel, yaml, py DONE
- 大多数的自动化测试用例都是手工测试转成的。
- 支持读取Excel操作 DONE
- 收集用例,运行,生成报告 DONE
- 支持日志处理 logging DONE
- 支持配置文件处理 py DONE
- 支持邮件发送(框架实现, Jenkins)
- 支持数据驱动 DONE
- 支持接口访问 doing…
怎么实现的:
- 分层设计, 介绍各种包,各个模块的用途
对自己写的代码简单的自测
- main 函数
分层设计
好处:方便维护和管理
- cases 用例
- 通用程序, common
- 辅助函数,通常和项目,业务有关, api
- 测试数据独立管理