需求:
1、在cnkdlManage 管理后台使用管理员身份登录后,循环新增5个账号
2、按新增账号时的固定前缀来查询,查出符合条件的5个账号
3、将这5个账号分别设置成为管理员
4、最终将这5个账号全部删除
完整项目
1、新建New Project—-> cnkdMange
2、新建 common 包,放置配置文件
3、新建 testCase 包,放置测试用例
4、新建 testReport 文件夹,放置测试报告
5、新建 tools 包,放置工具类文件
6、新建 runTest.py 写整个项目的入口
7、复制一个 plugins包,里面是第三方写测试报告的方法,直接使用—> HTMLTestRunnerPlugins.py
开始写代码
1、在common 包里新建 config.py 存放配置信息,例如ip地址,端口号等,比如说在写脚本的时候往往是写的测试环境的地址,然后上线后如果需要验证,仅需要在配置文件这里改一下ip和端口号,后面的代码都不需要动
class Configure:
base_url = "xxxxxxx.f3322.net"
port = "8803"
user_name = "wwwsss"
user_password = "123456"
2、在tools包里新建 utils.py 文件,存放基本工具类的方法,里面的方法多使用静态方法,其他文件引用时不需要实例化就直接引用
import os
import random
import string
import time
import zipfile
import yagmail
from common.config import Configure
from plugins import HTMLTestRunnerPlugins
class Utils:
@staticmethod
def get_base_url():
"""
获取url
:return:
"""
return "http://" + Configure.base_url + ":" + Configure.port + "/admin/apis/"
@staticmethod
def get_base_fron_url():
"""
获取url
:return:
"""
return "http://" + Configure.base_url + ":" + Configure.port + "/apis/"
@staticmethod
def random_phone_no(start_no=None, digit=11):
"""
获取随机手机号
:return:
"""
no_start = ['132', '134', '135', '136', '137', '138', '139', '150', '180']
if not start_no:
start_no = random.choice(no_start)
end = "".join(random.sample(string.digits, digit - 3))
return start_no + end
@staticmethod
def random_username(start_str=None, digit=10):
"""
获取随机手机号
:return:
"""
str_start = ['wwss', 'ssrr', 'wwsr']
if not start_str:
start_str = random.choice(str_start)
end = "".join(random.sample(string.digits, digit - 3))
return start_str + end
@staticmethod
def get_report_name(test_suite):
"""
生成一个完整的测试报告名称
:return:-->rep_dir
"""
now_time_str = time.strftime("%Y-%m-%d %H.%M.%S")
rep_dir = "./testReport/" + now_time_str + "_reportResult.html"
# 创建一个报告,使用二进制流写入
with open(rep_dir, "wb") as fp:
# 生成报告,并将报告内容写入fp 报告文件,并获取HTMLTestRunner的操作对像。里面的参数直接在plugins里的文件里按住ctrl点击函数名称,获取里面的参数
runner = HTMLTestRunnerPlugins.HTMLTestRunner(
stream=fp,
title=" cnkdl系统接口测试报告",
description="cnkdl系统接口测试,包含登录、新建用户、设置角色,删除用户等接口",
tester="xxxxxx"
)
# 执行测试用例并写入测试报告
runner.run(test_suite)
return rep_dir
@staticmethod
def auto_send_email(to_user, subject, contents, report_dir):
"""
发送邮件
:param to_user: 发给谁
:param subject: 邮件主题
:param contents: 描述
:param report_dir: 附件
:return:
"""
# 封装发送邮件的服务(需要去配置),即是自己要发出邮件地邮箱
# password 不是登录邮箱的密码,是一个密钥,需要在邮箱那里获取
yag_obj = yagmail.SMTP(
user="xxxxxx_111@163.com",
password="BZEBQTHCBVALPIYZ",
host="smtp.163.com"
)
return yag_obj.send(to_user, subject, contents, report_dir)
@staticmethod
def do_zip_file(dir_path):
"""
将文件打包成zip文件
:param dir_path: 需要打包的文件
:return: 返回打包的完整文件路径地址
"""
output_name = f"{dir_path}.zip"
parent_name = os.path.dirname(dir_path)
zip_file = zipfile.ZipFile(output_name, "w", zipfile.ZIP_DEFLATED)
# 多层级压缩
for root, dirs, files in os.walk(dir_path):
for file in files:
if str(file).startswith("~$"):
continue
filepath = os.path.join(root, file)
write_path = os.path.relpath(filepath, parent_name)
zip_file.write(filepath, write_path)
zip_file.close()
return output_name
4、在testCase 写测试用例:test_1_cnkdManage.py
import random
import time
import unittest
from loguru import logger
import requests
from common.config import Configure
from tools.utils import Utils
class CnkdlManage(unittest.TestCase):
"""cnkdl系统后台--账号部分"""
def utify_get_token(self):
"""
统一登录接口获取token值
:return: -->token
"""
url = Utils.get_base_url() + "system/pc/api/sys/user/login"
request_params = {
"userName": "xxxxxrong",
"password": "123456",
"ip": "127.0.0.0",
"loginName": "xxxxxrong",
"loginPassword": "123456"
}
request_data = requests.post(url=url, json=request_params)
logger.info("登录接口的入参:" + str(request_params))
response_data = request_data.json()
logger.info("登录接口的出参:" + str(response_data))
if response_data["code"] == 200:
logger.info("登录成功,获取到token")
print(response_data["data"]["token"])
return response_data["data"]["token"]
else:
logger.error("登录失败,获取不到token")
# @unittest.skip
def test_1_new_account(self):
"""
新增账号接口
:return:
"""
i = 1
while i <= 5:
url = Utils.get_base_url() + "system/pc/sys/user/save"
request_params = {
"nickname": Configure.user_name + str(random.randint(1, 1000)),
"loginName": Configure.user_name + str(random.randint(1, 1000)),
"loginPassword": "123456",
"confirmPassword": "123456",
"gmtExpires": "2023-07-31 00:00:00",
"remark": ""
}
request_headers = {"token": self.utify_get_token()}
logger.info("新增账号接口入参:" + str(request_params))
request_data = requests.post(url=url, json=request_params, headers=request_headers)
response_data = request_data.json()
logger.info("新增账号接口出参:" + str(response_data))
if response_data["data"] == "添加成功":
logger.info("新增账号接口执行成功")
else:
logger.error("新增账号接口执行失败")
# self.assertEqual(200, response_data["code"], "新增账号接口执行成功")
i += 1
def test_2_research_account(self):
"""
查询账号
:return: -->listss
"""
url = Utils.get_base_url() + "system/pc/sys/user/list"
CnkdlManage().test_1_new_account()
request_params = {"pageCurrent": 1, "pageSize": 200, "nickname": Configure.user_name}
request_headers = {"token": self.utify_get_token()}
request_data = requests.post(url=url, json=request_params, headers=request_headers)
response_data = request_data.json()
logger.info("查询用户接口返数据:" + str(response_data))
lists = response_data["data"]["list"]
listss = []
for a in lists:
listss.append(a["id"])
# print(listss[0])
return listss
# @unittest.skip
def test_3_allocation(self):
"""设置权限"""
list2 = CnkdlManage().test_2_research_account()
for i in list2:
url = Utils.get_base_url() + "system/pc/sys/user/allocation"
request_params = {"id": i, "roleIdList": ["1"]}
request_headers = {"token": self.utify_get_token()}
request_data = requests.post(url=url, json=request_params, headers=request_headers)
logger.info("设置权限接口入参:" + str(request_params))
response_data = request_data.json()
logger.info("设置权限接口出参:" + str(response_data))
self.assertEqual(200, response_data["code"], "设置权限成功")
def test_4_delete_account(self):
"""删除账号"""
time.sleep(5)
list2 = CnkdlManage().test_2_research_account()
for i in list2:
url = Utils.get_base_url() + "system/pc/sys/user/delete"
request_params = {"id": i}
request_headers = {"token": self.utify_get_token()}
logger.info("删除接口入参:" + str(request_params))
request_data = requests.delete(url=url, data=request_params, headers=request_headers)
response_data = request_data.json()
logger.info("删除接口出参:" + str(response_data))
self.assertEqual("删除成功", response_data["data"], "删除接口执行成功")
5、 在runTest.py 文件里设置入口,并且将测试报告发出去
import unittest
from tools.utils import Utils
if name == ‘main‘:
“””整个项目的入口”””
# 测试套件
test_suite = unittest.defaultTestLoader.discover("./testCase", pattern="test*.py")
# 生成报告 文件
report_dir = Utils.get_report_name(test_suite)
# 发送报告邮件
to_user = "xxxx_111@163.com", "xxxxxx841@qq.com"
subject = "cnkdl系统 的接口测试报告"
contents = ["你好,", "报告在附件里", "请注意查收"]
result = Utils.auto_send_email(to_user, subject, contents, report_dir)
6 、运行runTest文件,最终对应的邮箱会收到测试报告