欢迎查看“x-utest系统”帮助文档¶
局域网系统安装¶
使用 docker-compose 部署(推荐)¶
基本环境¶
- Linux 宿主机
- Docker 环境
- docker-compose 工具
构建镜像¶
直接安装方式部署¶
基本环境¶
- Ubuntu 14.04/16.04
- Python 3.5+
- Git
- MongoDB 3.4-3.6
- NodeJS 8.9.3+
前端¶
工具准备¶
下载 Nodejs, 自行在 http://nodejs.cn/ 下载最新版 可以在命令行测试是否安装成功,输入
node -v
测试npm是否安装成功,输入
npm -v
如果都显示版本号数字,则没有异常,已安装成功 nodejs 及包管理工具
依赖安装¶
(以下操作在项目根目录下使用命令行输入)
首先安装网页打包工具webpack及vue等依赖项
由于 npm 在国外服务器下载的原因,如果网络比较理想,可以直接输入
npm install
如果网络较差或者等待后卡住不动,可以直接使用淘宝镜像服务器 安装 npm 的国内工具 cnpm, 输入
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm 可以替代npm使用,来安装包和依赖
cnpm -v
如果显示目录和版本号,则 cnpm 安装成功
cnpm install
等待下载完成,如果出现安装失败的异常,请尝试使用管理员权限执行
安装¶
本地需要开启服务接口,进入目录执行命令行 先设置对应的服务接口地址
node init
(如果你安装了cnpm,以下两个npm命令请替换为cnpm执行)
根据提示输入服务器 IP 地址和 xtest 服务端口号(8009),改好后开始打包项目,命令行输入
npm run build
执行完成 会在根目录下生成 /dist 的静态资源文件夹, 放在Web服务器上 本地也可以使用 Nodejs 开启 Web 服务进行测试,默认 8896 端口,输入
npm run start
本地可访问 http://localhost:8896 或者 http://IP:8896
服务端¶
MongoDB 配置¶
确认已安装好 MongoDB, 安装过程可参考 http://blog.csdn.net/nxyx520/article/details/79564288
注意:MongoDB 版本需要为 3.4 - 3.6,其他版本不支持。建议使用 3.6
mongo --version
MongoDB shell version: 3.6.2
登录 MongoDB
mongo
添加 admin 数据库的用户名密码
use admin
db.createUser({
user:"admin",
pwd:"admin",
roles:[{
role:"userAdminAnyDatabase",
db:"admin"
}]
})
db.auth("admin", "admin")
添加 xtest 数据库的用户名密码
use xtest
db.createUser({
user:"xtest",
pwd:"xtest@2018",
roles:[{role:"readWrite", db:"xtest"}]
})
db.auth("xtest", "xtest@2018")
安装依赖¶
安装 x-utest 服务端代码基本包
cd xt-server-base
sudo ./install
使用 pip 安装部分开源库
cd xt-server-api
pip install -r requirement.txt
下载并安装 dtlib 库,版本 new
git clone https://github.com/ityoung/dtlib.git
cd dtlib
./install.sh
Nginx 安装配置¶
使用 apt 安装 nginx(测试版本 openresty/1.9.7.4)
apt-get install nginx
软链接 xt-server-api/nginx_config 目录中的配置文件到 /etc/nginx/conf.d/ 目录下,并重启 nginx 服务使之生效
cd /etc/nginx/conf.d/
ln -s <YOUR_BASE_PATH>/xtest-server/nginx_config/* .
service nginx restart
其中 <YOUR_BASE_PATH> 为 xt-server-api 所在的目录。
重启 nginx 服务后,检查 8099, 8009 两个端口是否处于监听状态
netstat -ntlp | grep 80
tcp 0 0 0.0.0.0:8099 0.0.0.0:* LISTEN 29871/nginx
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 29871/nginx
开始使用吧¶
浏览器打开 http://IP:8099 ,点击下一步即可初始化系统数据库,并获得一个管理员账号密码。使用该账号密码即可登录 X-Test 测试系统。
Xtest系统¶
系统简介¶
系统主页:
http://gtestbce.gtapp.xyz/
使用步骤:
- 输入用户名密码(admin/admin@2018)登录
- 创建一个项目,查看详细配置信息
- 下载sdk-demo
- 填写自己的配置信息
- 运行demo
- 上传demo的测试结果
- 分享可视化的报告
- 查看项目成长图
本系统主要的受众是: 自动化测试工程师,拥有编码能力的测试开发人员。
如果你不会开发,请先补充基础知识再尝试使用本系统。
本系统主要解决如下几个问题:
- 测试报告的自动化生成及存储
- 测试报告的信息流转
- 以测试报告来量化整个项目周期
可视化测试报告图¶
形成稳定的产品测试线路图:

对测试记录生成 分享链接 ,供其他非登录用户直接进行访问:

被分享和传播的精美测试报告:

可以任意邮件或者QQ微信进行分享和传播,极大的提高了报告的 可读性和传播性。
可视化项目成长图¶
在人多的测试报告数据进行累积后,可以形成清晰的产品线路图。
效果图:

对测试记录生成 分享链接 ,供其他非登录用户直接进行访问。
主要特点:
- 以测试用例的数目和失败数量来量化开发过程
- 最终失败用例数是趋向于0的
- 随着功能的增加,总的用例数原则上是一直在增长的
- 以用例成功率来衡量每个版本的发布节点
定位和展望¶
系统定位:
- 本系统定位为 自动化 判定测试报告系统
- 没有代码执行系统,需要自己去写测试代码本地执行
- 可以将执行系统放在Jenkins里面去自动构建触发你的执行代码,然后将测试结果显示到本系统中
- Jenkins只能显示构建的历史,然后本系统可以显示测试的历史,刚好可以成为一个补充
后续展望:
- 提供看板报表功能,将量化过程投影到公司电视墙上
- 自动化SAAS服务器再触发相应的webhook,回调到后续的系统(例如:自动化发布系统)
- 对接Jenkins等持续集成
关于x-utest系统,目前还有些功能在完善中,完善后再对外开放,相当于测试界人员的福利吧。
后文提要¶
在正式开始系统的长篇大论前,有必要综述一下本文的内容。
- 展示了一种 测试量化开发 和 测试驱动开发 的工作流
- 陈述了一些关于自动化测试的基本概念
- 强调了一些必要的良好规范的开发习惯
- 提出了一种自动化测试报告的报文格式
- 给出了一种测试报告内容的提取的方法(以python下的测试框架pyunit为例子)
- 介绍了一种pyunit和自动化报告平台的数据对接方法
最终希望本文能够给测试开发从业人员一些启示,同时本文提到的系统能够让:
- 注重软件质量
- 有条件做自动化测试
的软件公司形成良好的开发过程,成就自己高效透明的开发信息流。
新手快速使用¶
使用步骤¶
本方提供了基于 Python的Pyunit的Demo程序,大家只需要登录x-utest系统,修改配置信息即可运行使用。
客户端Demo¶
Demo地址:
https://github.com/x-utest/xtest-python-demo.git
登录x-utest系统,可以查找自己项目配置查找:
点击项目的菜单:

查看指定配置:

在文件 apps/xtest_cfg.py 中替换掉原有的配置:
# todo 在系统中注册了,组织信息中看到这个值,替换到此处
project_id = '590c2a0947fc894a51f9e616'
app_id = '3832f354872411e6a7c700163e006b26'
app_key = '38342936872411e6a7c700163e006b26'
在文件 start.py 中, 将 IP 修改为你的 IP
然后运行程序(基于python3.5及以上) :
python start.py
运行结果如下:
(py3venv) harmo@harmo-pc:~/work/workspace/xtest-python-demo$ python demo.py
FFF...
======================================================================
FAIL: test_first_hello_world_false (__main__.MyTestDemo)
用户不应该越权访问资源
----------------------------------------------------------------------
Traceback (most recent call last):
File "demo.py", line 65, in test_first_hello_world_false
self.assertTrue(False, msg='Hello Word是失败的')
AssertionError: False is not true : Hello Word是失败的
======================================================================
FAIL: test_first_hello_world_false2 (__main__.MyTestDemo)
此处用户操作太多内容了
----------------------------------------------------------------------
Traceback (most recent call last):
File "demo.py", line 71, in test_first_hello_world_false2
self.assertTrue(False, msg='Hello Word是失败的')
AssertionError: False is not true : Hello Word是失败的
======================================================================
FAIL: test_first_hello_world_false3 (__main__.MyTestDemo)
这个用户不是超级管理员
----------------------------------------------------------------------
Traceback (most recent call last):
File "demo.py", line 77, in test_first_hello_world_false3
self.assertTrue(False, msg='Hello Word是失败的')
AssertionError: False is not true : Hello Word是失败的
----------------------------------------------------------------------
Ran 6 tests in 0.000s
FAILED (failures=3)
{"code":200,"msg":"success","data":""}
其中,最后的:
{"code":200,"msg":"success","data":""}
的 success 表明上传报告服务器成功
执行完毕后,即可在自己的 x-utest系统 界面看到相应的报告,并进行分享
x-utest报告接口¶
认证接口¶
功能:生成token以授权接口的调用
路径:
/testdata/api-auth/
传入参数:
- app_id
- app_key
请求方法:POST
返回值:
{
"code": 200,
"msg": "",
"data": {
"user": null,
"u_name": null,
"user_id": null,
"token": "7c45fc98391311e78e1a00163e006b26",
"ip": "113.57.119.51",
"user_agent": null,
"rc_time": "2017-05-15 10:09:11",
"c_type": 4,
"app_id": "3832f354872411e6a7c700163e006b26",
"last_use_time": "2017-05-15 07:22:54",
"finger_prt": null,
"c_name": "api",
"id": "59190dc747fc890ec5ba42e0",
"is_del": false,
"cookie": null,
"del_time": "2017-05-15 10:09:11"
}
}
其中最重要的是:
- token 后续进行接口调用的授权值
数据接口¶
x-utest系统提供了报告上行接口。
接口路径:
/testdata/create-test-data/
token认证: 需要,token放url里面
请求方式: POST
请求参数:
{
"pro_id": "57a835c8c6e905166da94243",
"pro_version":"1.3.4.5",
"run_time": 51.77724599838257,
"was_successful": false,
"total": 88,
"skipped": 7,
"errors": 0,
"failures": 10,
"details": [
{
"status": "failures",
"note": "AssertionError: 访问不合法,返回404",
"explain": "只是用于测试的Demo,没有太多意义",
"test_case": "test_nginx_config"
},
{},
{}
]
}
以上的请求参数分为两部分:
- 单元测试框架标准结果部分
- 自动化测试项目后期添加
其中:
- pro_id 项目在x-utest系统中的id代号
- pro_version 被测对象的唯一版本号
- run_time 运行所有脚本花费的时间
测试统计信息:
- was_successful 整个过程是否成功
- total 全部的测试用例总数
- skipped 跳过的用例数
- errors 执行出现代码错误的用例数
- failures 用例判定为失败的用例数
- details 有问题的用例的详细输出信息列表
关于 details 里面的字段解释:
- test_case 测试用例函数名称
- status 测试用例执行结果状态
- 主要包含如下几种状态:
- errors 执行错误的用例
- failures 断言为失败的用例
- skipped 跳过的用例
- explain 测试函数的整体备注解释文档
- note 测试函数里面具体的assert断言的msg备注点
属于自动化测试项目后期运算出来的数据,其它的则是标准的单元测试框架提供的测试结果中自带内容。
上传数据成功后的返回值:
{"code":200,"msg":"success","data":""}
提取测试结果¶
本小节以 pyunit 单元测试框架为例子,来对测试报告所需要的内容进行提取。
主要内容¶
TextTestResult 结果中包含的如下内容:
- errors 错误详细信息列表
- failures 运行失败详细信息列表
- skipped 跳过的详细信息列表
- testsRun 运行的用例总数
具体如下图所示:

具体条目¶
以 failures 为例子:

本测试用例的描述:
编号 索引为0 的数据:
- _testMethodName 测试函数名称
- _testMethodDoc 测试函数的文档,这里面一般陈述本测试的功能
打印出来的堆栈错误信息:
- 编号 索引为1 的数据。
提取方法¶
对测试结果进行内容提取,同时加入如下内容:
- 测试执行时间
- 项目ID
- 项目版本号
进行标准化格式打包。
代码:
def dict_encode_test_results(test_results, **kwargs):
"""
将测试结果进行json编码
:param test_results:
:type test_results: unittest.TestResult
:return:
"""
run_time = kwargs.get('run_time', None)
pro_id = kwargs.get('pro_id', None)
pro_version = kwargs.get('pro_version', None)
# 主体部分
res_dict = dict(
# was_successful=True if test_results.wasSuccessful() else False,
was_successful=test_results.wasSuccessful(),
total=test_results.testsRun,
failures=len(test_results.failures),
errors=len(test_results.errors),
skipped=len(test_results.skipped),
run_time=run_time,
pro_id=pro_id,
pro_version=pro_version
)
# 详细信息部分
failure_list = [] # 失败的内容
for x in test_results.failures:
note_data = {
'test_case': x[0]._testMethodName,
'explain': x[0]._testMethodDoc.rstrip('\n :return:'),
'status': 'failures',
'note': x[1]
}
failure_list.append(note_data)
for i in test_results.errors:
note_data = {
'test_case': i[0]._testMethodName,
'explain': i[0]._testMethodDoc.rstrip('\n :return:'),
'status': 'errors',
'note': i[1]
}
failure_list.append(note_data)
res_dict['details'] = failure_list
return res_dict
可以提到一个如下的字典对象:
test_res_dict = {
"pro_version": "1.16.10.10.1",
"pro_id": "57fa12ec47fc894ee04a2c69", # 在后台管理系统中组织信息详细信息里面可以查看到:项目ID
"run_time": 51.772,
"was_successful": False,
"skipped": 2,
"errors": 1,
"failures": 1,
"total": 5,
"details": [
{
"status": "failures",
"note": "AssertionError: 访问不合法,返回404",
"explain": "只是用于测试的Demo,没有太多意义",
"test_case": "test_nginx_config"
}
]
}
对接x-utest¶
主要步骤如下:
- 使用微信在首页扫码进行注册或者登录
- 【资产管理】-【项目信息】查看到 项目编号
- 查看 app_id 和 app_key
依据x-utest系统提供的API进行接口调用,可将 判定测试 的结果上传到 测试报告系统服务器 数据库,即可生成 软件系统量化线路图 和 精美测试报表服务 。
有效工作流¶
开发工作流¶
大家都试着构想过这样一种工作流:
- 小组成员一起开会设计好系统
- 定义好接口并形成书面文档
- 开发人员负责 软件功能项目 和测试人员负责 测试用例项目,同步开发
- 长时间的小步快速开发和迭代,功能和用例数都不断增长
- 功能项目的目标是让所有的测试用例都通过
- 最终达成团队的预期目标,项目上线
工程流程图如下:

流程优势¶
以上工作流的好处如下:
- 开发和测试同步进行,人员得到最大化利用
- 让小步和快速迭代上线成为可能,极大降低了项目无谓的消耗和项目失败的风险
- 每个过程都严格的让测试用例对软件质量进行了有效把控
- 测试用例的总数和成功总数对软件这个黑盒形成了良好的 量化
- 整个开发过程和进度对于 不懂技术 的团队成员也是 完全透明 的
整个过程用两句话可以描述:
- 测试 驱动 开发
- 测试 量化 开发
当然,一个IT企业,做到以上是非常不容易的,但是可以朝向这个方向不断前进。
本文先介绍一个系统来助力IT企业实现这一目标。在实现这一目标之前,先达成一个小目标:
让企业重视软件质量,提升软件质量控制的 技术和方法论 ,让软件测试活动变得 流行 起来,让软件测试成为整体软件生产活动中的 高频事件 。
为了上述的小目标落地,那么先要到如下几点:
- 让软件测试工作确实起到 量化 开发过程的作用
- 加速测试重要产出物 *测试报告 的曝光度和传播度
三方系统¶
借助 x-utest系统 可以有效实现这个目标:
- 测试开发人员完成自动化测试项目的编写
- 提取测试项目的报告
- 按照 x-utest系统 组织成 规范的报告格式
- 上传测试报告到 x-utest系统
- 根据时间线形成完整的 产品成长量化图
- 形成直观的 测试报告分享报表,直接分享给协作人员查看
基本理论和开发规范¶
概念陈述¶
目前软件测试行业的理论和细分领域层出不穷,主要包括以下几方面:
- 判定测试
- 压力测试
- 响应测试
- 安全测试
本文只讲 判定测试 这个领域的内容。
所谓的 判定测试 包括如下几类:
- 界面自动化
- 接口自动化
- 单元自动化
其实这就是 分层自动化金字塔 中的三层。

它们的共同点就是:对于一个定义数据和定义的执行过程通常会有一个预期输出,如果实际输出和预期输出不同,则定义为Flase,否则为True。
所以,基于以上特点,都可以归结到 “判定测试” 的概念里面来,可以生成一样的 测试报告产出物,都适用于本文提到的 x-utest系统 。
此处的 判定测试 的测试场景和类别包括且不限于:
- 单元测试
- 接口测试
- UI测试
- 环境测试
只要是涉及到:
- 测试用例
- 测试套件
- 测试结果
- 测试详情
都可以使用本系统生成报表并存储历史测试数据。
开发规范¶
为了达到上述的预期效果,有一些基本的开发规范需要地团队共同遵守。
- 良好分层的软件系统架构
- 明确的版本管理体系
- 形成良好信息流的基础软件功能
分层架构¶
前面提到了 软件的分层金字塔 结构,是目前主流互联网公司的所推崇的基本结构。 很多无法推进自动化测试的软件系统,大部分问题都出在这儿了,需要好好设计一下。
版本管理¶
所谓的版本管理,其实目标就是:明确被测对象。
一个软件系统从开始到结束它的名字基本上是不会变的,但是每个时期,只要是任何代码的改变,其实它都是变化的。对外展现的是不变性,对内则一定要进行好的区分。
被测对象版本号的重要性。每次提测而且需要记录备案的软件系统必须是独一无二的,拥有唯一的代号,即: 版本号。
关于版本号的命名方式,业界有很我成熟的方法,在此不再赘述。只要满足如下要求即可:
- 保证版本号的唯一性
- 从字面意思可以看得到版本的演进和迭代顺序
基础功能¶
形成流畅的信息流的前提是:所有的过程尽量能够自动化。
对于测试人员来说,有两样东西非常重要:
- 被测对象版本号及特性信息
- 运行相关环境及软件库依赖
以 服务端接口 作为被测试对象的 自动化测试 过程为例子,开发人员必须至少提供一个接口:
- 显示应用程序内部信息的接口。
对于该接口的定义,下面给出一个示范:
- 接口名称
- /app-info/
- 请求方式
- GET
- 输入参数
- 无
返回值:
{
"code": 200,
"msg": "",
"data": {
"server": "tornado",
"req_time": "2017-04-19 15:38:46",
"app_version": "3.17.04.18.1"
}
}
参数说明:
- app_version 服务端接口应用程序版本号
- server 服务器类型
如果有其它需要关注的信息,可以随时扩展上去。
本文最关注的内容是 app_version 所表示的被测对象版本信息 ,在上面的接口中有所体现。
客户端集成演示¶
概述¶
针对目前的一些应该的自动化工具,我们都提供了相应的Demo集成,欢迎大家下载学习和交流。
Pyunit¶
项目主页:
https://github.com/x-utest/xtest-python-demo.git
下载方式:
git clone https://github.com/x-utest/xtest-python-demo.git
感谢:
- @Harmo哈莫
Junit¶
todo
TestNG¶
xtest-testng-sdk 项目主页:
https://github.com/x-utest/xtest-testng-sdk
下载最新release的jar包并导入到你的测试项目中,依照项目主页Readme的步骤操作。
Release:
https://github.com/x-utest/xtest-testng-sdk/releases
感谢:
- @严北
client-java-testng-demo 项目主页:
https://github.com/x-utest/client-java-testng-demo
依照项目主页Readme的步骤操作。
感谢:
- @凯哥