51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【周活动】 找茬--心里圈的故事 !【长期招募】博为峰网校招聘兼职讲师!横扫BAT,Python全栈测试开发技能大全
【104期】:测试如何在持续集成中占有.... 【杂志】测试技术体面升级指南 【专题】用尽一切办法只为让你学好用例 自学软件测试那点事
查看: 1039|回复: 3

[转贴] 300 行 Python 代码打造实用接口测试框架

[复制链接]

该用户从未签到

发表于 2017-6-29 09:52:46 | 显示全部楼层 |阅读模式
在刚开始实现ApiTestEngine的时候,@kasi 提议做一个Java版的。对于这样的建议,我当然是拒绝的,瞬即回复了他,“人生苦短,回头是岸啊”。
当然,我没好意思跟他说的是,我不会Java啊。不过最主要的原因嘛,还是因为Python的语法简洁,可以采用很少的代码量实现丰富的功能。
有多简洁呢?
刚在coveralls上看了下ApiTestEngine框架的代码统计行数,总行数只有268行,还不足300行。

当然,这个行数指的是框架本身的Python代码行数,不包括示例注释的行数。从上图可以看出来,LINES列是文件总行数,RELEVANT列是实际的Python代码行数。例如ate/runner.py文件,注释的行数是远多于实际代码行数的。
最极端的一个例子是,ate/testcase.py文件中的parse函数,示例注释行数35行,Python代码只有2行。
  1. def parse(self, testcase_template):
  2.    """ parse testcase_template, replace all variables with bind value.
  3.    variables marker: ${variable}.
  4.    @param (dict) testcase_template
  5.        {
  6.            "request": {
  7.                "url": "http://127.0.0.1:5000/api/users/${uid}",
  8.                "method": "POST",
  9.                "headers": {
  10.                    "Content-Type": "application/json",
  11.                    "authorization": "${authorization}",
  12.                    "random": "${random}"
  13.                },
  14.                "body": "${data}"
  15.            },
  16.            "response": {
  17.                "status_code": "${expected_status}"
  18.            }
  19.        }
  20.    @return (dict) parsed testcase with bind values
  21.        {
  22.            "request": {
  23.                "url": "http://127.0.0.1:5000/api/users/1000",
  24.                "method": "POST",
  25.                "headers": {
  26.                    "Content-Type": "application/json",
  27.                    "authorization": "a83de0ff8d2e896dbd8efb81ba14e17d",
  28.                    "random": "A2dEx"
  29.                },
  30.                "body": '{"name": "user", "password": "123456"}'
  31.            },
  32.            "response": {
  33.                "status_code": 201
  34.            }
  35.        }
  36.    """
  37.    return self.substitute(testcase_template)
复制代码
另外,如果算上单元测试用例的行数(731行),总的Python代码行数能达到1000行的样子。嗯,代码可以精简,但是单元测试覆盖率还是要保证的,不达到90%以上的单元测试覆盖率,真不好意思说自己做了开源项目啊。

那这不足300行的Python代码,实际实现了哪些功能呢?
对比下《接口自动化测试的最佳工程实践(ApiTestEngine)》中规划的特性,已经实现了大半(前六项),至少已经算是一个有模有样的接口测试框架了。
  • 支持API接口的多种请求方法,包括 GET/POST/HEAD/PUT/DELETE 等
  • 测试用例与代码分离,测试用例维护方式简洁优雅,支持YAML/JSON
  • 测试用例描述方式具有表现力,可采用简洁的方式描述输入参数和预期输出结果
  • 接口测试用例具有可复用性,便于创建复杂测试场景
  • 测试执行方式简单灵活,支持单接口调用测试、批量接口调用测试、定时任务执行测试
  • 具有可扩展性,便于扩展实现Web平台化
  • 测试结果统计报告简洁清晰,附带详尽日志记录,包括接口请求耗时、请求响应数据等
  • 身兼多职,同时实现接口管理、接口自动化测试、接口性能测试(结合Locust)
后面剩下的特性还在实现的过程中,但是可以预见得到,最后框架本身总的Python代码行数也不会超过500行。
当然,单纯地比代码行数的确是没有什么意义,写得爽写得开心才是最重要的。
最后引用下Guido van Rossum的语录:
Life is short, go Pythonic!
阅读更多
  • 接口自动化测试的最佳工程实践(ApiTestEngine)》
  • 《ApiTestEngine 演化之路(0)开发未动,测试先行》
  • 《ApiTestEngine 演进之路(1)搭建基础框架》
  • ApiTestEngine GitHub源码
最后的最后《ApiTestEngine 演进之路》系列文章还在继续写,只是前几天主要精力在编码实现上,博客方面没有同步更新,接下来我会整理好思路,继续完成余下的部分。

回复

使用道具 举报

该用户从未签到

发表于 2017-6-29 10:06:57 | 显示全部楼层
代码估计很精炼啊,我看了下我们这边的python版本代码都不止那么点,应该几千行了
其实是业务不一样,我们这边需要实现各种业务,例如加密解密,数据库各种操作等等,日志的各种处理,流程的转向等等,甚至包括数据的生成逻辑,任务的调度,消息队列等等,还有预期判断 request发送消息 uinittest基本没用🙈
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2017-6-29 10:11:11 | 显示全部楼层
requests 主要是处理跟HTTP请求响应部分的;至于你说的那些业务逻辑,是单独实现的,后面你可以看下我的案例(还在写)。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /2 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2019-7-19 20:45 , Processed in 0.061418 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表