Requests+Python-ddt数据驱动

一、数据驱动

1.pip install ddt 安装模块

2.使用场景

(1)ddt一般是针对同一个接口,只是参数值不同,比如一个接口需要十组乃至更多组数据,写在脚本里显然是不科学的,也不便于维护。

(2)ddt可与表格一起使用,从表格读取出批量的测试数据,作为参数依次传入

3.案例

测试系统登录功能,使用ddt模块读取测试数据,测试数据存放在excel维护,实现登录方法测试登录脚本以及测试数据分离

二、代码

 common中的HTMLReport.py和read_excel.py为测试报告和表格读取数据封装

1.common.login_api.py

测试登录方法(返回登录结果中的msg信息,用于测试断言)

# coding:utf-8
import requests

class Login():
    def __init__(self):
        self.s = requests.session()
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
            "Origin":"http://192.168.1.9:8080"
        }
        self.login_url = "http://192.xxx.x.x:8080/xxxxxxxxxxx"

    def login(self, userAccount, pwd):
        data = {"userAccount": userAccount, "pwd": pwd}
        body = {
            "data":'%s'%data
        }
        r1 = self.s.post(self.login_url,headers=self.headers,data=body,verify=False)
        return r1.json()["msg"]  # 返回msg信息,测试脚本断言


if __name__ == '__main__':
    l = Login()
    l.login("suner", "123456")

 2.case.test_login_api.py

测试登录脚本

# coding:utf-8
import os
import ddt
import unittest
from common.login_api import Login
from common.read_excel import ExcelUtil


cur_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))  # 返回当前文件的上上层目录
excel_path = os.path.join(cur_path , "test_data/login_data.xlsx")  # 测试数据login_data.xlsx文件路径

# 调用封装好的读取表格方法,取出表格中的数据
instance_excel = ExcelUtil(excel_path , "Sheet1")
da = instance_excel.dict_data()
# print(da)

@ddt.ddt
class TestLogin(unittest.TestCase):
    def setUp(self):
        self.lo = Login()

    @ddt.data(*da)
    def test_login(self, data): # {0}是在最终的测试报告中依次打印中测试数据
        """测试数据:{0}"""
        userAccount = data["userAccount"]
        pwd = data["pwd"]
        exp = data["exp"]
        res = self.lo.login(userAccount, pwd)
        self.assertEqual(exp, res)

if __name__ == '__main__':
    unittest.main()

3.run_main.py 执行测试

import unittest
import os
import time
from common.HTMLReport import HTMLTestRunner

# 当前脚本所在文件真实路径
cur_path = os.path.dirname(os.path.realpath(__file__))

def add_case(caseName="case", rule="test_*.py"):
    """第一步:加载所有测试用例"""
    case_path = os.path.join(cur_path, caseName)  # 用例文件夹
    # 文件夹不存在就创建一个文件夹
    if not os.path.exists(case_path): os.mkdir(case_path)

    # 定义discover加载所有测试用例
    # case_path:执行用例的目录;pattern:匹配脚本名称的规则;top_level_dir:默认为None
    discover = unittest.defaultTestLoader.discover(case_path, pattern=rule, top_level_dir=None)
    return discover

def run_case(all_case, reportName="report"):
    """第二步:执行所有的用例,并把结果写入到html测试报告中"""
    now = time.strftime("%Y_%m_%d_%H_%M_%S")
    report_path = os.path.join(cur_path, reportName)
    if not os.path.exists(report_path): os.mkdir(report_path)
    report_abspath = os.path.join(report_path, now + "result.html")
    print("report path:%s" % report_abspath)

    fp = open(report_abspath, "wb")
    runner = HTMLTestRunner(stream=fp, title="自动化测试报告,测试结果如下:",
                                                  description="用例执行情况")
    # 调用add_case函数
    runner.run(all_case)
    fp.close()

def get_report_file(report_path):
    """第三步:获取最新的测试报告"""
    lists = os.listdir(report_path)
    lists.sort(key=lambda fn: os.path.getmtime(os.path.join(report_path, fn)))
    print("最新测试生成的报告:" + lists[-1])
    # 找到生成最新的报告文件
    report_file = os.path.join(report_path, lists[-1])
    return report_file


if __name__ == '__main__':
    all_case = add_case()  # 加载用例
    run_case(all_case)  # 执行用例

    report_path = os.path.join(cur_path, "report")
    report_file = get_report_file(report_path) # 生成报告

三、结果

1.控制台运行结果

2.测试报告

猜你喜欢

转载自blog.csdn.net/qq_39620483/article/details/86618532
今日推荐