在刚开始实现ApiTestEngine
的时候,@kasi 提议做一个 Java 版的。对于这样的建议,我当然是拒绝的,瞬即回复了他,“人生苦短,回头是岸啊”。
当然,我没好意思跟他说的是,我不会 Java 啊。不过最主要的原因嘛,还是因为 Python 的语法简洁,可以采用很少的代码量实现丰富的功能。
有多简洁呢?
刚在coveralls
上看了下ApiTestEngine
框架的代码统计行数,总行数只有 268 行,还不足 300 行。
当然,这个行数指的是框架本身的Python
代码行数,不包括示例注释的行数。从上图可以看出来,LINES
列是文件总行数,RELEVANT
列是实际的Python
代码行数。例如ate/runner.py
文件,注释的行数是远多于实际代码行数的。
最极端的一个例子是,ate/testcase.py
文件中的parse
函数,示例注释行数 35 行,Python
代码只有 2 行。
def parse(self, testcase_template):
""" parse testcase_template, replace all variables with bind value.
variables marker: ${variable}.
@param (dict) testcase_template
{
"request": {
"url": "http://127.0.0.1:5000/api/users/${uid}",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"authorization": "${authorization}",
"random": "${random}"
},
"body": "${data}"
},
"response": {
"status_code": "${expected_status}"
}
}
@return (dict) parsed testcase with bind values
{
"request": {
"url": "http://127.0.0.1:5000/api/users/1000",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"authorization": "a83de0ff8d2e896dbd8efb81ba14e17d",
"random": "A2dEx"
},
"body": '{"name": "user", "password": "123456"}'
},
"response": {
"status_code": 201
}
}
"""
return self.substitute(testcase_template)
另外,如果算上单元测试用例的行数(731 行),总的Python
代码行数能达到 1000 行的样子。嗯,代码可以精简,但是单元测试覆盖率还是要保证的,不达到 90% 以上的单元测试覆盖率,真不好意思说自己做了开源项目啊。
那这不足 300 行的 Python 代码,实际实现了哪些功能呢?
对比下《接口自动化测试的最佳工程实践(ApiTestEngine)》中规划的特性,已经实现了大半(前六项),至少已经算是一个有模有样的接口测试框架了。
YAML/JSON
后面剩下的特性还在实现的过程中,但是可以预见得到,最后框架本身总的Python
代码行数也不会超过 500 行。
当然,单纯地比代码行数的确是没有什么意义,写得爽写得开心才是最重要的。
最后引用下Guido van Rossum
的语录:
Life is short, go Pythonic!
ApiTestEngine
GitHub 源码《ApiTestEngine 演进之路》系列文章还在继续写,只是前几天主要精力在编码实现上,博客方面没有同步更新,接下来我会整理好思路,继续完成余下的部分。