开源地址:https://github.com/houc/UI
一、 创建测试的项目与所需必要参数(先把开源的代码块下载下来)
1、下载下来后,建议使用pycharm打开,并依次进入config->conf.yaml并打开进行编辑操作
base_url: # 不可更名称
new_backstage: http://1904155033.pre-pool1-site.make.yun300.cn # 被测试项目前缀地址
backstage_user: 13120396777 # 需要登录首页账号
backstage_password: test123456 # 需要登录首页的密码
excel_parameter: # 不可更名称
project_name: door_ui # 项目名称(需要手动创建这个项目名称,在UI目录下创建即可。另外在这个项目名称下还需要创建common.py和common.yaml)
test_version: V0.0.0 # 测试时的版本号(主要用于测试报告中体现)
science: 预发布 # 测试环境(主要用于测试报告中体现)
report: # 不可更名称
ip: 171.221.241.20 # 服务器ip,为空传本地IP地址,本地IP地址输入后,端口也需要传入,否则广域网无法正常预览测试报告
port: 20019 # 端口,
save: 7 # 报告存放时间(天)
config: # 不可更名称
thread: # True,开启多线程(注意开启此项会大量占用CPU资源);False,不采用多线程执行
token_keys: TOKEN # token表示key名
level: 10 # 日志等级
logs_save: 5 # 日志最长保存天数
re: '*_st.py' # 正则匹配执行的py,如果想只执行一个py的数据,那么改一下此处的后缀名即可!
task_time: "9:04" # 定时任务如:单纯数字默认为分钟如:1-99999...,想每天18:20运行,即[1day|18:20]。 为每周时,切勿加时间如:[3week|07:58]这样会使程序报错。固定每周3十二点半执行则:[1wednesday|12:30]
browser: False # 浏览器隐藏执行开关,隐藏: True,不隐藏: False;无头浏览超慢,建议使用有头
logo_url: # 项目logo连接
re_run_count: 2 # 失败重跑次数 1 表示1次,从1开始,并非从0开始
re_sleep: 2 # 失败重跑等待时间,单位为 秒 建议不超过300秒
module_run: test_debug # 指定需要运行的模块,示例:login
token_invalid: 6 # 接口token登录几个小时后失效,并重新登录获取新的token
skip_module: {} # 跳过模块>示例:{ValidateLogin_st: 这是原因, customer_st: 这是原因}
send_email: # 不可更名称
server: smtp.gouuse.cn # 邮件发送的服务器
port: 25 # 发送邮件端口
send_account: houchao@gou.cn # 发送账号
send_password: Li123456 # # 发送密码
receiver: [1063116271@qq.com] # 接收人
CC: [houchao@gou.cn] # 抄送人
sql: # 不可更名称 这里是写好了对应方法建议不要去动它
name_db: 'case_db' # 数据库
address: localhost # 数据库地址,此处为本地数据库地址
sql_table: DROP TABLE IF EXISTS result # 表是否存在
sql_create_title: CREATE TABLE result (
case_catalog longtext,
case_level longtext,
case_module longtext,
case_name longtext,
case_url longtext,
case_scene longtext,
case_status longtext,
case_results longtext,
case_error_reason longtext,
case_insert_parameter longtext,
case_wait_time longtext,
case_img longtext,
case_author longtext,
case_remark longtext,
insert_time timestamp
) # 插入表头
sql_query: SELECT * FROM result # 查询result里面的所有数据
sql_insert: INSERT INTO result(case_catalog,
case_level,
case_module,
case_name,
case_url,
case_scene,
case_status,
case_results,
case_error_reason,
case_insert_parameter,
case_wait_time,
case_img,
case_author,
case_remark,
insert_time
) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') # 插入数据
sql_delete: DELETE FROM result WHERE 1=1 # 数据库全部清除数据
sql_update: UPDATE result SET %s WHERE %s # 更新数据
sql_create_list: create database %s character set utf8 # 创建数据库
2、创建好项目并配置好conf.yaml中参数后,接下来就可以直接编写用例了,依次打开你刚创建的项目->common.yaml
door_ui: # 项目名称必须要与conf.yaml->project_name && 创建项目名称一一对应
product_manage: # 测试的模块,这里如一级目录产品管理
- product_exist: # 测试模模块,这里如二级目录产品是否存在
url: # 整个测试下的的后缀url
assembly: 产品管理-产品 # 整个用例下取一个模块的名称,主要用于报告体现
className: TestProduct # 类名
funName:
- test_product_is_exist: { # 测试方法名称
url: "/managePanel/product/list?appId=2", # 这条用例下下的后缀url
assembly:, # 这条用例下的模块
author: 小明, # 编写用例负责人,用于报告体现
level: 中, # 用例等级,用于报告体现
scene: "验证后台增加产品前台是否存在,并且同时验证产品中的图片是否前台展示\n # 场景用于报告体现
case_remark: "场景中执行完成后,回到前台校验是否正确", # 这条用例中的备注用于报告体现
asserts: True, # 这条用例的断言
}
# 这是这个模块下的下一条用例
test_product_is_exist_01: { # 测试方法名称
url: "/managePanel/product/list?appId=2", # 这条用例下下的后缀url
assembly:, # 这条用例下的模块
author: 小明, # 编写用例负责人,用于报告体现
level: 中, # 用例等级,用于报告体现
scene: "验证后台增加产品前台是否存在,并且同时验证产品中的图片是否前台展示\n # 场景用于报告体现
case_remark: "场景中执行完成后,回到前台校验是否正确", # 这条用例中的备注用于报告体现
asserts: True, # 这条用例的断言
}
# 产品管理下的下一级模块
- product_import:
url:
assembly: 产品管理-产品
className: TestProductImport
funName:
- test_product_import: {
url: "/managePanel/product/list?appId=2",
assembly:,
author: 小花,
level: 中,
scene: "导入产品,是否成功\n
case_remark: "",
asserts: True,
}
3、编辑完用例后,记得要运行一下initialization.py,运行它之后会自动生成对应的用例,生成完成后可以直接维护对应用例
import unittest
import time
import os
from config_path.path_file import PATH
from model.MyUnitTest import UnitTests
from model.CaseSupport import test_re_runner, check_upper_is_ok
from model.SkipModule import Skip, current_module
from door_ui.test_debug.currency import TestDebugElement
_SKIP = Skip(current_module(PATH(__file__))).is_skip
_SKIP_REASON = Skip(current_module(PATH(__file__))).is_reason
@unittest.skipIf(_SKIP, _SKIP_REASON)
class Debug(UnitTests):
"""
:param: RE_LOGIN: 需要切换账号登录,当RE_LOGIN = True时,需要将LOGIN_INFO的value值全填写完成,
如果请求的账号中只有一家公司,那么company中的value就可以忽略不填写,否则会报错...
:param: MODULE: 为当前运行的模块,根据当前运行的模块调用common中的对应的用例方法,需保留此变量方法
:param: toke_module: 读取token的node
:param: BROWSER: True执行浏览器,默认为开启
"""
RE_LOGIN = False
BROWSER = False
LOGIN_INFO = {"account": None, "password": None, "company": None}
MODULE = os.path.abspath(__file__)
toke_module = str(MODULE).split('\\')[-1].split('.')[0]
set_up = UnitTests.setUp
@test_re_runner(set_up, retry_count=1) # 失败重跑方法
@check_upper_is_ok('test_all_5') # 检查上一条用例是否失败或者错误,如果是失败或者错误,则跳过这条用例,但是需要根据unittest执行顺序进行编写
def test_all(self):
"""
使用接口验证openapi+redis->>清理Redis缓存
"""
self.first = s
self.assertEqual(self.first, self.second)
@test_re_runner(set_up)
@check_upper_is_ok('test_all_1')
def test_all_2(self):
"""
使用接口验证openapi+redis->>清理Redis缓存
"""
# self.first = False
self.assertEqual(self.first, self.second)
4、想发送报告和邮箱,最后则运行runner.py这个方法,想定时运行则timing_run.py这个方法