当前位置:   article > 正文

【2023最全教程】Python接口测试实战之搭建自动化测试框架(建议收藏)_python接口自动化框架

python接口自动化框架

目录

一.数据分离:从Excel中读取数据

二.Excel读取方法

三.封装读取excel操作

四.增加日志(log)功能

五.发送邮件

六.使用配置文件

七.框架整理

一.数据分离:从Excel中读取数据

之前的用例中,数据直接写在代码文件里,不利于修改和构造数据,这里我们使用Excel保存测试数据,实现代码和数据的分离,新建Excel文件test_user_data.xlsx包含两个工作簿TestUserLoginTestUserReg,并复制到项目根目录下。

更新: excel表格中,增加一个headers列,内容为json格式, 如下

二.Excel读取方法

Python我们使用三方库xlrd来读取Excel,使用pip install xlrd安装xlrd

  1. import xlrd
  2. wb = xlrd.open_workbook("test_user_data.xlsx")  # 打开excel
  3. sh = wb.sheet_by_name("TestUserLogin")  # 按工作簿名定位工作表
  4. print(sh.nrows)  # 有效数据行数
  5. print(sh.ncols)  # 有效数据列数
  6. print(sh.cell(00).value)  # 输出第一行第一列的值`case_name`
  7. print(sh.row_values(0))  # 输出第1行的所有值(列表格式)
  8. # 将数据和标题组装成字典,使数据更清晰
  9. print(dict(zip(sh.row_values(0), sh.row_values(1))))
  10. # 遍历excel,打印所有的数据
  11. for i in range(sh.nrows):
  12.     print(sh.row_values(i))

输出结果

  1. 3
  2. 5
  3. case_name
  4. ['case_name''url''method''data''expect_res']
  5. {'case_name''test_user_login_normal''url''http://115.28.108.130:5000/api/user/login/''method''POST''data''{"name": "张三","password":"123456"}''expect_res''<h1>登录成功</h1>'}
  6. ['case_name''url''method''data''expect_res']
  7. ['test_user_login_normal''http://115.28.108.130:5000/api/user/login/''POST''{"name": "张三","password":"123456"}''<h1>登录成功</h1>']
  8. ['test_user_login_password_wrong''http://115.28.108.130:5000/api/user/login/''POST''{"name": "张三","password":"1234567"}''<h1>失败,用户不存在</h1>']
  1. 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
  2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
  3. 可以加入我们一起交流。而且还有很多在自动化,
  4. 性能,安全,测试开发等等方面有一定建树的技术大牛
  5. 分享他们的经验,还会分享很多直播讲座和技术沙龙
  6. 可以免费学习!划重点!开源的!!!
  7. qq群号:110685036

 

三.封装读取excel操作

1.新建read_excel.py

我们的目的是获取某条用例的数据,需要3个参数,excel数据文件名data_file,工作簿名sheet,用例名case_name。如果我们只封装一个函数,每次调用(每条用例)都要打开一次excel并遍历一次,这样效率比较低,我们可以拆分成两个函数,一个函数excel_to_list(data_file, sheet),一次获取一个工作表的所有数据,另一个函数get_test_data(data_list, case_name)从所有数据中去查找到该条用例的数据。

  1. import xlrd
  2. def excel_to_list(data_file, sheet):
  3.     data_list = []  # 新建个空列表,来乘装所有的数据
  4.     wb = xlrd.open_workbook(data_file)  # 打开excel
  5.     sh = wb.sheet_by_name(sheet)  # 获取工作簿
  6.     header = sh.row_values(0)  # 获取标题行数据
  7.     for i in range(1, sh.nrows):  # 跳过标题行,从第二行开始取数据
  8.         d = dict(zip(header, sh.row_values(i)))  # 将标题和每行数据组装成字典
  9.         data_list.append(d)
  10.     return data_list  # 列表嵌套字典格式,每个元素是一个字典
  11. def get_test_data(data_list, case_name):
  12.     for case_data in data_list:
  13.         if case_name == case_data['case_name']:  # 如果字典数据中case_name与参数一致
  14.             return case_data
  15.             # 如果查询不到会返回None
  16. if __name__ == '__main__':   # 测试一下自己的代码
  17.     data_list = excel_to_list("test_user_data.xlsx""TestUserLogin")  # 读取excel,TestUserLogin工作簿的所有数据
  18.     case_data = get_test_data(data_list, 'test_user_login_normal')  # 查找用例'test_user_login_normal'的数据
  19.     print(case_data)

输出结果

{'case_name''test_user_login_normal''url''http://115.28.108.130:5000/api/user/login/''method''POST''data''{"name": "张三","password":"123456"}''expect_res''<h1>登录成功</h1>'}

2.用例中使用方法(test_user_login.py)

  1. import unittest
  2. import requests
  3. from read_excel import *  # 导入read_excel中的方法
  4. import json  # 用来转化excel中的json字符串为字典
  5. class TestUserLogin(unittest.TestCase):
  6.     @classmethod
  7.     def setUpClass(cls):   # 整个测试类只执行一次
  8.         cls.data_list = excel_to_list("test_user_data.xlsx""TestUserLogin")  # 读取该测试类所有用例数据
  9.         # cls.data_list 同 self.data_list 都是该类的公共属性
  10.     def test_user_login_normal(self):
  11.         case_data = get_test_data(self.data_list, 'test_user_login_normal')   # 从数据列表中查找到该用例数据
  12.         if not case_data:   # 有可能为None
  13.             print("用例数据不存在")
  14.         url = case_data.get('url')   # 从字典中取数据,excel中的标题也必须是小写url
  15.         data = case_data.get('data')  # 注意字符串格式,需要用json.loads()转化为字典格式
  16.         expect_res = case_data.get('expect_res')  # 期望数据
  17.         res = requests.post(url=url, data=json.loads(data))  # 表单请求,数据转为字典格式
  18.         self.assertEqual(res.text, expect_res)  # 改为assertEqual断言
  19. if __name__ == '__main__':   # 非必要,用于测试我们的代码
  20.     unittest.main(verbosity=2)

3.用例中使用方法(test_user_reg.py)

  1. import unittest
  2. import requests
  3. from db import *
  4. from read_excel import *
  5. import json
  6. class TestUserReg(unittest.TestCase):
  7.     @classmethod
  8.     def setUpClass(cls):
  9.         cls.data_list = excel_to_list("test_user_data.xlsx""TestUserReg")  # 读取TestUserReg工作簿的所有数据
  10.     def test_user_reg_normal(self):
  11.         case_data = get_test_data(self.data_list, 'test_user_reg_normal')
  12.         if not case_data:
  13.             print("用例数据不存在")
  14.         url = case_data.get('url')
  15.         data = json.loads(case_data.get('data'))  # 转为字典,需要取里面的name进行数据库检查
  16.         expect_res = json.loads(case_data.get('expect_res'))  # 转为字典,断言时直接断言两个字典是否相等
  17.         name = data.get("name")  # 范冰冰
  18.         # 环境检查
  19.         if check_user(name):
  20.             del_user(name)
  21.         # 发送请求
  22.         res = requests.post(url=url, json=data)  # 用data=data 传字符串也可以
  23.         # 响应断言(整体断言)
  24.         self.assertDictEqual(res.json(), expect_res)
  25.         # 数据库断言
  26.         self.assertTrue(check_user(name))
  27.         # 环境清理(由于注册接口向数据库写入了用户信息)
  28.         del_user(name)
  29. if __name__ == '__main__':    # 非必要,用于测试我们的代码
  30.     unittest.main(verbosity=2)  

四.增加日志(log)功能

1.新建config.py文件

  1. import logging
  2. logging.basicConfig(level=logging.DEBUG,  # log level
  3.                     format='[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s',  # log格式
  4.                     datefmt='%Y-%m-%d %H:%M:%S',  # 日期格式
  5.                     filename='log.txt',  # 日志输出文件
  6.                     filemode='a')  # 追加模式
  7. if __name__ == '__main__':
  8.     logging.info("hello")

运行后在当前目录下生成log.txt,内容如下

[2018-09-11 18:08:17] INFO [<module>: config.py, 38] hello

2.日志别级(Log Level)

  • CRITICAL: 用于输出严重错误信息

  • ERROR: 用于输出错误信息

  • WARNING: 用于输出警示信息

  • INFO: 用于输出一些提升信息

  • DEBUG: 用于输出一些调试信息

3.日志优先级

CRITICAL > ERROR > WARNING > INFO > DEBUG

指定level = logging.DEBUG所有等级大于等于DEBUG的信息都会输出;若指定level = logging.ERROR WARNING,INFO,DEBUG小于设置级别的信息不会输出。

4.日志格式说明

  • %(levelno)s: 打印日志级别的数值

  • %(levelname)s: 打印日志级别名称

  • %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

  • %(filename)s: 打印当前执行程序名

  • %(funcName)s: 打印日志的当前函数

  • %(lineno)d: 打印日志的当前行号

  • %(asctime)s: 打印日志的时间

  • %(thread)d: 打印线程ID

  • %(threadName)s: 打印线程名称

  • %(process)d: 打印进程ID

  • %(message)s: 打印日志信息

5.日志在项目中的使用

  • db.py

  1. import pymysql
  2. from config import *
  3. # 封装数据库查询操作
  4. def query_db(sql):
  5.     conn = get_db_conn()
  6.     cur = conn.cursor()  
  7.     logging.debug(sql)    # 输出执行的sql
  8.     cur.execute(sql)
  9.     conn.commit()
  10.     result = cur.fetchall() 
  11.     logging.debug(result)  # 输出查询结果
  12.     cur.close() 
  13.     conn.close() 
  14.     return result 
  15. # 封装更改数据库操作
  16. def change_db(sql):
  17.     conn = get_db_conn() 
  18.     cur = conn.cursor()
  19.     logging.debug(sql)  # 输出执行的sql
  20.     try:
  21.         cur.execute(sql) 
  22.         conn.commit() 
  23.     except Exception as e:
  24.         conn.rollback() 
  25.         logging.error(str(e))  # 输出错误信息
  26.     finally:
  27.         cur.close() 
  28.         conn.close()
  • 用例

  1. import unittest
  2. import requests
  3. from read_excel import *  # 导入read_excel中的方法
  4. import json  # 用来转化excel中的json字符串为字典
  5. from config import *
  6. class TestUserLogin(unittest.TestCase):
  7.     @classmethod
  8.     def setUpClass(cls):   # 整个测试类只执行一次
  9.         cls.data_list = excel_to_list("test_user_data.xlsx""TestUserLogin")  # 读取该测试类所有用例数据
  10.         # cls.data_list 同 self.data_list 都是该类的公共属性
  11.     def test_user_login_normal(self):
  12.         case_data = get_test_data(self.data_list, 'test_user_login_normal')   # 从数据列表中查找到该用例数据
  13.         if not case_data:   # 有可能为None
  14.             logging.error("用例数据不存在")
  15.         url = case_data.get('url')   # excel中的标题也必须是小写url
  16.         data = case_data.get('data')  # 注意字符串格式,需要用json.loads()转化为字典格式
  17.         expect_res = case_data.get('expect_res')  # 期望数据
  18.         res = requests.post(url=url, data=json.loads(data))  # 表单请求,数据转为字典格式
  19.         logging.info("测试用例:{}".format('test_user_login_normal'))
  20.         logging.info("url:{}".format(url))
  21.         logging.info("请求参数:{}".format(data))
  22.         logging.info("期望结果:{}".format(expect_res))
  23.         logging.info("实际结果:{}".format(res.text)
  24.         self.assertEqual(res.text, expect_res)  # 断言
  25. if __name__ == '__main__':
  26.     unittest.main(verbosity=2)

输出结果

  1. [2018-09-13 10:34:49] INFO [log_case_info: case_log.py, 8] 测试用例:test_user_login_normal
  2. [2018-09-13 10:34:49] INFO [log_case_info: case_log.py, 9] url:http://115.28.108.130:5000/api/user/login/
  3. [2018-09-13 10:34:49] INFO [log_case_info: case_log.py, 10] 请求参数:{"name""张三","password":"123456"}
  4. [2018-09-13 10:34:49] INFO [log_case_info: case_log.py, 11] 期望结果:<h1>登录成功</h1>
  5. [2018-09-13 10:34:49] INFO [log_case_info: case_log.py, 12] 实际结果:<h1>登录成功</h1>

因为每个用例都要输出很多log信息,我们封装一个case_log的函数

  1. from config import *
  2. import json
  3. def log_case_info(case_name, url, data, expect_res, res_text): 
  4.     if isinstance(data,dict):
  5.         data = json.dumps(data, ensure_ascii=False)  # 如果data是字典格式,转化为字符串
  6.     logging.info("测试用例:{}".format(case_name))
  7.     logging.info("url:{}".format(url))
  8.     logging.info("请求参数:{}".format(data))
  9.     logging.info("期望结果:{}".format(expect_res))
  10.     logging.info("实际结果:{}".format(res_text)

简化后的用例log输出

  1. import unittest
  2. import requests
  3. from read_excel import *  
  4. import json
  5. from config import *
  6. from case_log import log_case_info  # 导入方法
  7. class TestUserLogin(unittest.TestCase):
  8.     @classmethod
  9.     def setUpClass(cls):  
  10.         cls.data_list = excel_to_list("test_user_data.xlsx""TestUserLogin"
  11.     def test_user_login_normal(self):
  12.         case_data = get_test_data(self.data_list, 'test_user_login_normal'
  13.         if not case_data
  14.             logging.error("用例数据不存在")
  15.         url = case_data.get('url')  
  16.         data = case_data.get('data'
  17.         expect_res = case_data.get('expect_res')
  18.         res = requests.post(url=url, data=json.loads(data))
  19.         log_case_info('test_user_login_normal', url, data, expect_res, res_text)  # 输出用例log信息
  20.         self.assertEqual(res.text, expect_res)  
  21. if __name__ == '__main__':
  22.     unittest.main(verbosity=2)

五.发送邮件

在生成报告后我们希望框架能自动把报告发送到我们的邮箱中。和outlookfoxmail等邮件客户端一样,Python中发送邮件需要通过Emailsmtp服务发送。

1.首先需要确认用来发送邮件的邮箱是否启用了smtp服务;

2.编写邮件内容(Email邮件需要专门的MIME格式);

3.组装Email头(发件人,收件人,主题);

4.连接smtp服务器并发送邮件;

  1. import smtplib  # 用于建立smtp连接
  2. from email.mime.text import MIMEText  # 邮件需要专门的MIME格式
  3. # 1. 编写邮件内容(Email邮件需要专门的MIME格式)
  4. msg = MIMEText('this is a test email''plain''utf-8')  # plain指普通文本格式邮件内容
  5. # 2. 组装Email头(发件人,收件人,主题)
  6. msg['From'] = 'test_results@sina.com'  # 发件人
  7. msg['To'] = '2375247815@qq.com'  # 收件人
  8. msg['Subject'] = 'Api Test Report'  # 邮件主题
  9. # 3. 连接smtp服务器并发送邮件
  10. smtp = smtplib.SMTP_SSL('smtp.sina.com')  # smtp服务器地址 使用SSL模式
  11. smtp.login('自己的邮箱地址''自己的邮箱密码')  # 用户名和密码
  12. smtp.sendmail("接收邮件地址1""接收邮件地址2", msg.as_string())
  13. smtp.quit()

5.中文邮件主题、HTML邮件内容,及附件

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart  # 混合MIME格式,支持上传附件
  4. from email.header import Header  # 用于使用中文邮件主题
  5. 1.  编写邮件内容
  6. with open('report.html', encoding='utf-8'as f:  # 打开html报告
  7.     email_body = f.read()  # 读取报告内容
  8. msg = MIMEMultipart()  # 混合MIME格式
  9. msg.attach(MIMEText(email_body, 'html''utf-8'))  # 添加html格式邮件正文(会丢失css格式)
  10. 2. 组装Email头(发件人,收件人,主题)
  11. msg['From'= 'test_results@sina.com'  # 发件人
  12. msg['To'= '2375247815@qq.com'  # 收件人
  13. msg['Subject'= Header('接口测试报告''utf-8')  # 中文邮件主题,指定utf-8编码
  14. 3. 构造附件1,传送当前目录下的 test.txt 文件
  15. att1 = MIMEText(open('report.html''rb').read(), 'base64''utf-8')  # 二进制格式打开
  16. att1["Content-Type"= 'application/octet-stream'
  17. att1["Content-Disposition"= 'attachment; filename="report.html"'  # filename为邮件中附件显示的名字
  18. msg.attach(att1)
  19. 4. 连接smtp服务器并发送邮件
  20. smtp = smtplib.SMTP_SSL('smtp.sina.com')  # smtp服务器地址 使用SSL模式
  21. smtp.login('test_results@sina.com''hanzhichao123')  # 用户名和密码
  22. smtp.sendmail("test_results@sina.com""2375247815@qq.com", msg.as_string())
  23. smtp.sendmail("test_results@sina.com""superhin@126.com", msg.as_string())  # 发送给另一个邮箱
  24. smtp.quit()

6.封装发送邮件方法

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart  # 混合MIME格式,支持上传附件
  4. from email.header import Header  # 用于使用中文邮件主题
  5. from config import *
  6. def send_email(report_file):
  7.     msg = MIMEMultipart()  # 混合MIME格式
  8.     msg.attach(MIMEText(open(report_file, encoding='utf-8').read(), 'html''utf-8'))  # 添加html格式邮件正文(会丢失css格式)
  9.     msg['From'= 'test_results@sina.com'  # 发件人
  10.     msg['To'= '2375247815@qq.com'  # 收件人
  11.     msg['Subject'= Header('接口测试报告''utf-8')  # 中文邮件主题,指定utf-8编码
  12.     att1 = MIMEText(open(report_file'rb').read(), 'base64''utf-8')  # 二进制格式打开
  13.     att1["Content-Type"= 'application/octet-stream'
  14.     att1["Content-Disposition"= 'attachment; filename="report.html"'  # filename为邮件中附件显示的名字
  15.     msg.attach(att1)
  16.     try:
  17.         smtp = smtplib.SMTP_SSL('smtp.sina.com')  # smtp服务器地址 使用SSL模式
  18.         smtp.login('test_results@sina.com''hanzhichao123')  # 用户名和密码
  19.         smtp.sendmail("test_results@sina.com""2375247815@qq.com", msg.as_string())
  20.         smtp.sendmail("test_results@sina.com""superhin@126.com", msg.as_string())  # 发送给另一个邮箱
  21.         logging.info("邮件发送完成!")
  22.     except Exception as e:
  23.         logging.error(str(e))
  24.     finally:
  25.         smtp.quit()

7.run_all.py中结束后发送邮件

  1. import unittest
  2. from HTMLTestReportCN import HTMLTestRunner
  3. from config import *
  4. from send_email import send_email
  5. logging.info("====================== 测试开始 =======================")
  6. suite = unittest.defaultTestLoader.discover("./")
  7. with open("report.html"'wb'as f:  # 改为with open 格式
  8.     HTMLTestRunner(stream=f, title="Api Test", description="测试描述", tester="卡卡").run(suite)
  9. send_email('report.html')  # 发送邮件
  10. logging.info("======================= 测试结束 =======================")

六.使用配置文件

和项目的log配置一样,数据库服务器地址,邮件服务地址我们一般放到配置文件config.py中。

  1. import logging
  2. import os
  3. # 项目路径
  4. prj_path = os.path.dirname(os.path.abspath(__file__))  # 当前文件的绝对路径的上一级,__file__指当前文件
  5. data_path = prj_path  # 数据目录,暂时在项目目录下
  6. test_path = prj_path  # 用例目录,暂时在项目目录下
  7. log_file = os.path.join(prj_path, 'log.txt')  # 也可以每天生成新的日志文件
  8. report_file = os.path.join(prj_path, 'report.html')  # 也可以每次生成新的报告
  9. # log配置
  10. logging.basicConfig(level=logging.DEBUG,  # log level
  11.                     format='[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s',  # log格式
  12.                     datefmt='%Y-%m-%d %H:%M:%S',  # 日期格式
  13.                     filename=log_file,  # 日志输出文件
  14.                     filemode='a')  # 追加模式
  15. # 数据库配置
  16. db_host = '127.0.0.1'   # 自己的服务器地址
  17. db_port = 3306
  18. db_user = 'test'
  19. db_passwd = '123456'
  20. db = 'api_test'
  21. # 邮件配置
  22. smtp_server = 'smtp.sina.com'
  23. smtp_user = 'test_results@sina.com'
  24. smtp_password = 'hanzhichao123'
  25. sender = smtp_user  # 发件人
  26. receiver = '2375247815@qq.com'  # 收件人
  27. subject = '接口测试报告'  # 邮件主题

修改db.pysend_email.pyrun_all.py等对配置文件的引用

  • db.py

  1. import pymysql
  2. from config import *
  3. # 获取连接方法
  4. def get_db_conn():
  5.     conn = pymysql.connect(host=db_host,   # 从配置文件中读取
  6.                            port=db_port,
  7.                            user=db_user,
  8.                            passwd=db_passwd,  # passwd 不是 password
  9.                            db=db,
  10.                            charset='utf8')  # 如果查询有中文,需要指定测试集编码
  • send_email.py

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. from email.header import Header 
  5. from config import *
  6. def send_email(report_file):
  7.     msg = MIMEMultipart()
  8.     msg.attach(MIMEText(open(report_file, encoding='utf-8').read(), 'html''utf-8'))
  9.     msg['From'= 'test_results@sina.com'
  10.     msg['To'= '2375247815@qq.com'
  11.     msg['Subject'= Header(subject, 'utf-8')  # 从配置文件中读取
  12.     att1 = MIMEText(open(report_file'rb').read(), 'base64''utf-8')  # 从配置文件中读取
  13.     att1["Content-Type"= 'application/octet-stream'
  14.     att1["Content-Disposition"= 'attachment; filename="{}"'.format(report_file)  # 参数化一下report_file
  15.     msg.attach(att1)
  16.     try:
  17.         smtp = smtplib.SMTP_SSL(smtp_server)  # 从配置文件中读取
  18.         smtp.login(smtp_user, smtp_password)  # 从配置文件中读取
  19.         smtp.sendmail(sender, receiver, msg.as_string())
  20.         logging.info("邮件发送完成!")
  21.     except Exception as e:
  22.         logging.error(str(e))
  23.     finally:
  24.         smtp.quit()
  • run_all.py

  1. import unittest
  2. from HTMLTestReportCN import HTMLTestRunner
  3. from config import *
  4. from send_email import send_email
  5. logging.info("==================== 测试开始 =======================")
  6. suite = unittest.defaultTestLoader.discover(test_path)  # 从配置文件中读取用例路径
  7. with open(report_file'wb'as f:  # 从配置文件中读取
  8.     HTMLTestRunner(stream=f, title="Api Test", description="测试描述").run(suite)
  9. send_email(report_file)  # 从配置文件中读取
  10. logging.info("==================== 测试结束 =======================")

七.框架整理

当前所有文件(配置文件,公共方法,测试用例,数据,报告,log)都在项目根目录下,随着用例的增加和功能的补充,文件会越来越多,不便于维护和管理,因此我们要建立不同的文件夹,对文件进行分类组织。

1.在项目中新建以下文件夹

  • config: 存放项目配置文件

  • data: 存放用例数据文件

  • lib: 公共方法库

  • log: 存放日志文件

  • report: 存放报告文件

  • test: 存放测试用例

  • user: 存放user模块用例(模块下要有__init__.py,这样里面的用例才能读取到)

2.代码目录整理

  • 将配置文件config.py移动到config目录下

  • 将数据文件test_user_data.xlsx移动到data目录下

  • 将公共方法db.pysend_email.pycase_log.pyread_excel.pyHTMLTestReportCN.py移动到lib目录下

  • 将测试用例test_user_login.pytest_user_reg.py移动到test/user目录下,保留run_all.py在项目根目录下,如图

3.修改配置文件(config/config.py)

  1. import logging
  2. import os
  3. # 项目路径
  4. prj_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 当前文件的上一级的上一级目录(增加一级)
  5. data_path = os.path.join(prj_path, 'data')  # 数据目录
  6. test_path = os.path.join(prj_path, 'test')   # 用例目录
  7. log_file = os.path.join(prj_path, 'log''log.txt')  # 更改路径到log目录下
  8. report_file = os.path.join(prj_path, 'report''report.html')  # 更改路径到report目录下

4.修改对配置文件及公共方法的引用 为避免相对路径导包出错的问题,我们统一把导包搜索路径(sys.path)提升到项目根目录下,如lib/db.py

  • db.py

  1. import pymysql
  2. import sys
  3. sys.path.append('..')  # 提升一级到项目更目录下
  4. from config.config import *  # 从项目根目录下导入
  • test_user_login.py

  1. import unittest
  2. import requests
  3. import json
  4. import os  # 增加了一个os,需要用来组装路径
  5. import sys
  6. sys.path.append("../..")  # 提升2级到项目根目录下
  7. from config.config import *  # 从项目路径下导入
  8. from lib.read_excel import *  # 从项目路径下导入
  9. from lib.case_log import log_case_info  # 从项目路径下导入
  10. class TestUserLogin(unittest.TestCase):
  11.     @classmethod
  12.     def setUpClass(cls):   # 整个测试类只执行一次
  13.         cls.data_list = excel_to_list(os.path.join(data_path, "test_user_data.xlsx"),"TestUserLogin")  # 增加data路径
  • run_all.py

  1. import unittest
  2. from lib.HTMLTestReportCN import HTMLTestRunner  # 修改导入路径
  3. from config.config import *  # 修改导入路径
  4. from lib.send_email import send_email  # 修改导入路径
  5. logging.info("================================== 测试开始 ==================================")
  6. suite = unittest.defaultTestLoader.discover(test_path)  # 从配置文件中读取
  7. with open(report_file'wb'as f:  # 从配置文件中读取
  8.     HTMLTestRunner(stream=f, title="Api Test", description="测试描述").run(suite)
  9. send_email(report_file)  # 从配置文件中读取
  10. logging.info("================================== 测试结束 ==================================")

如果同一文件夹下的方法相互引用(如lib/read_excel.py假如需要引用lib/db.py),也需要采用这种从项目路径下导入的方式;run_all.py直接在项目路径下,不需要提升sys.path,无需相对导入我们自己的包时,如read_excel.py,不需要提升

5.运行run_all.py,根据log和报告调试代码,直至所有用例全部通过

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/820987
推荐阅读
相关标签
  

闽ICP备14008679号