Unittest+requests+mock+HTMLTestRunner+DDT接口自动化框架

概述:

(what)接口自动化是指模拟接口层面的自动化。(why)因为成本低可维护性高逐渐成为自动化测试的主流方向之一。

一、简要说明

环境:Python3.6,Unittest,Requests,Mock,DDT

ParamUnittest =  0.2
configparser  =  5.0.0
ddt           =  1.4.1
jsonpath      =  0.82
mock          =  4.0.2
openpyxl      =  3.0.4
requests      =  2.24.0
HTMLTestRunner=  0.9.1

流程说明:读取EXCEL测试数据->生成测试用例->执行测试用例->结果写入EXCEL->生成HTMLTestRunner报告

模块、类、包的设计说明:

baserequest.py 封装requests方法,支持(post\get\put)多协议扩展
handle_ini.py  读取配置文件,包括:域名的配置,email的配置,数据库的配置,取值规则的配置
mockvalue.py   封装mock响应值的方法,如依赖数据
Util/handl*.py token处理,json处理,封装用来assert的断言数据处理
RunCase.py     核心代码。聚合用例集并执行,最后生成报告

Excel测试数据格式如下图所示:


Excel用例.png

二、框架结构与流程

1.框架结构如下图所示:

框架结构.png

2.框架流程图如下图所示:

代码流程图.jpg

三、代码功能分析

1、Config.ini配置文件

此文件中[server]为域名相关配置,[json]为json处理规则相关配置

[server]
host=测试
username=测试
password=测试

[database]
database=测试
username=测试
password=测试


[json]
token_rule = $..token

2、openpyxl读取excel数据

一个接口可以定义多条case,get_excel_data为封装了读取所有excel中case的方法,最终存储到一个嵌套list中。

class HandExcel():

    def get_excel_data(self):
        """exccel里面所有的case数据以列表嵌套list存储)"""
        data_list = []
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i + 2))

        return data_list[:-1]   

3、ddt数据驱动获取所有case

在执行函数内获取所有的case,原理和for循环相似

@ddt.ddt
class Test_Index(unittest.TestCase)

    @ddt.data(*data)
    def test_mainindex(self, data):
        """执行case主流程"""
        case_id = data[0]
        i = excel_data.get_rows_number(case_id)  # 行号
        is_run = data[2]
        if is_run == "yes":
            data1 = json.loads(data[7])
            is_depend = data[3]

4、编写测试用例

@ddt.ddt
class Test_Index(unittest.TestCase):

    @ddt.data(*data)
    def test_mainindex(self, data):
        # 用例描述:调用商品分类接口拿到并根据依赖数据查询商品详情列表
        header = None
        get_token = None
        is_run = data[2]
        if is_run == "yes":
            url = data[5]
            method = data[6]
            expected_method = data[10]
            res = BaseRequest.run(method, url, data1, get_token, header)
            code = res['meta']["status"]
            message = res['meta']["msg"]
            if expected_method == "mec":
                configmes = handle_result_msg(url, code)
                self.assertEqual(configmes, message)

5、运行框架的主程序

class RunCase():
    def runcase(self):  # unittest discover管理case

        case_path = os.path.join(base_path, "testCase")

        discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")

        result_path = os.path.join(base_path, "Report", "report.html")
        with open(result_path, "wb") as f:
            runner = HTTPTestRunner.HTMLTestRunner(stream=f, title="测试报告", description="测试人员:ysz")
            runner.run(discover)

6、logs INFO示例

2020-08-13 18:13:06,111 - logs… - INFO - D:\untitled\untitled\shopvinterface\Report\report.html
2020-08-13 18:13:06,112 - logs… - INFO - D:\untitled\untitled\shopvinterface\Run\testcase1_ddt.py

7、Mock部分代码

def mock_depend():
    """mock依赖数据"""
    data = {
        "data": {
            "id": 1
            
        }
    }

    depend_value = data.get('data').get('id')
    get_data = mock.Mock(return_value=depend_value)
    res = get_data
    return res()

8、baserequest部分代码

class BaseRE():
    """基础请求"""
    def send_post(self, url, data, get_token=None, header=None):
        """post请求"""
        request = requests.Session()  # 自动关联session
        res = request.post(url=url, data=data, headers=header).json()

        if get_token is not None:
            """token写入"""
            token = ' '.join(jsonpath.jsonpath(res, '$..token'))
            header2 = {"Authorization": token}
            write_token(header2, get_token["is_token"])

        return res

四、HTMLTestRunner报告总览及Excel结果

1.HTMLTestRunner报告总览如下图所示:


HTMLTestRunner报告.png

2.Excel结果如下图所示:


excel结果.png

五、jenkins集成

使用jenkins插件生成HTMLTestRunner报告


jenkins输出报告.png

六、框架扩展优化

进行中...

七、shell脚本自动执行框架

使用了shell脚本自动执行框架,每次执行前清空日志,并输出最新日志到控制台:


shell脚本-用于跑自动化框架输出日志.png

项目Github地址:https://github.com/Keith-Yong/pyapiservice


客官请留步!
点个赞❤️再走~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354