欢迎查看“x-utest系统”帮助文档

局域网系统安装

使用 docker-compose 部署(推荐)

基本环境

  • Linux 宿主机
  • Docker 环境
  • docker-compose 工具

构建镜像

代码准备

下载 x-utest docker-compose 项目源码

git clone https://github.com/x-utest/xtest-docker-compose.git

运行

进入 docker-compose 项目根目录, 运行 cmd.sh

初始化MongoDB

选择步骤1, 初始化 MongoDB.

该步骤会自动创建一个数据卷, 并创建用于 x-utest 测试平台的管理用户.

编译前端源码

执行步骤2, 将接口IP修改为本宿主机的IP, 以便其他机器能够访问. 修改IP完成后, 编译前端源码;

运行 x-utest 服务

在执行完成步骤1, 步骤2后, 执行步骤3即可启动 x-utest 测试平台.

开始使用吧!

浏览器输入 HOST_IP:8099,即可访问 x-utest 系统,欢迎使用!

默认用户名密码: admin/admin@2018, 请务必将第一次登录时的提示截图页面截图保存!

直接安装方式部署

基本环境

  • 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 及包管理工具

代码准备

在系统根目录下创建目录

进入 /www 目录后,下载 x-test 前端项目代码:

git clone https://github.com/x-utest/xtest-web.git
依赖安装

(以下操作在项目根目录下使用命令行输入)

首先安装网页打包工具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 服务端代码,版本 3.17.5.29.1

git clone https://github.com/x-utest/xtest-server.git
安装依赖

安装 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
启动 x-test 服务程序

最后一步,执行如下命令启动 x-test 服务端程序:

python start.py

开始使用吧

浏览器打开 http://IP:8099 ,点击下一步即可初始化系统数据库,并获得一个管理员账号密码。使用该账号密码即可登录 X-Test 测试系统。

Xtest系统

系统简介

系统主页

http://gtestbce.gtapp.xyz/

使用步骤:

  1. 输入用户名密码(admin/admin@2018)登录
  2. 创建一个项目,查看详细配置信息
  3. 下载sdk-demo
  4. 填写自己的配置信息
  5. 运行demo
  6. 上传demo的测试结果
  7. 分享可视化的报告
  8. 查看项目成长图

本系统主要的受众是: 自动化测试工程师,拥有编码能力的测试开发人员。

如果你不会开发,请先补充基础知识再尝试使用本系统。

本系统主要解决如下几个问题:

  1. 测试报告的自动化生成及存储
  2. 测试报告的信息流转
  3. 以测试报告来量化整个项目周期

可视化测试报告图

形成稳定的产品测试线路图:

_images/xtest-list-share.png

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

_images/xtest-share-gen.png

示例链接地址

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

_images/xtest-share-report.png

可以任意邮件或者QQ微信进行分享和传播,极大的提高了报告的 可读性和传播性

可视化项目成长图

在人多的测试报告数据进行累积后,可以形成清晰的产品线路图。

效果图:

_images/xtest-project-info.png

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

示例链接地址

主要特点:

  1. 以测试用例的数目和失败数量来量化开发过程
  2. 最终失败用例数是趋向于0的
  3. 随着功能的增加,总的用例数原则上是一直在增长的
  4. 以用例成功率来衡量每个版本的发布节点

定位和展望

系统定位:

  1. 本系统定位为 自动化 判定测试报告系统
  2. 没有代码执行系统,需要自己去写测试代码本地执行
  3. 可以将执行系统放在Jenkins里面去自动构建触发你的执行代码,然后将测试结果显示到本系统中
  4. Jenkins只能显示构建的历史,然后本系统可以显示测试的历史,刚好可以成为一个补充

后续展望:

  1. 提供看板报表功能,将量化过程投影到公司电视墙上
  2. 自动化SAAS服务器再触发相应的webhook,回调到后续的系统(例如:自动化发布系统)
  3. 对接Jenkins等持续集成

关于x-utest系统,目前还有些功能在完善中,完善后再对外开放,相当于测试界人员的福利吧。

后文提要

在正式开始系统的长篇大论前,有必要综述一下本文的内容。

  1. 展示了一种 测试量化开发测试驱动开发 的工作流
  2. 陈述了一些关于自动化测试的基本概念
  3. 强调了一些必要的良好规范的开发习惯
  4. 提出了一种自动化测试报告的报文格式
  5. 给出了一种测试报告内容的提取的方法(以python下的测试框架pyunit为例子)
  6. 介绍了一种pyunit和自动化报告平台的数据对接方法

最终希望本文能够给测试开发从业人员一些启示,同时本文提到的系统能够让:

  1. 注重软件质量
  2. 有条件做自动化测试

的软件公司形成良好的开发过程,成就自己高效透明的开发信息流。

新手快速使用

使用步骤

本方提供了基于 Python的Pyunit的Demo程序,大家只需要登录x-utest系统,修改配置信息即可运行使用。

客户端Demo

Demo地址:

https://github.com/x-utest/xtest-python-demo.git

登录x-utest系统,可以查找自己项目配置查找:

点击项目的菜单:

_images/xtest-client-config-0.png

查看指定配置:

_images/xtest-client-config-1.png

在文件 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报告接口

系统简介

域名路径:

http://api.apiapp.cc/

这些系统接口可以直接封装到sdk当中,目前提供了完整的python版本的sdk的demo供大家参考。

认证接口

功能:生成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"
        },
        {},
        {}
    ]
}

以上的请求参数分为两部分:

  1. 单元测试框架标准结果部分
  2. 自动化测试项目后期添加

其中:

  • 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 运行的用例总数

具体如下图所示:

_images/xtest-xunit-result.png

具体条目

failures 为例子:

_images/xtest-xunit-details.png

本测试用例的描述:

编号 索引为0 的数据:

  • _testMethodName 测试函数名称
  • _testMethodDoc 测试函数的文档,这里面一般陈述本测试的功能

打印出来的堆栈错误信息:

  • 编号 索引为1 的数据。

提取方法

对测试结果进行内容提取,同时加入如下内容:

  1. 测试执行时间
  2. 项目ID
  3. 项目版本号

进行标准化格式打包。

代码:

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

主要步骤如下:

  1. 使用微信在首页扫码进行注册或者登录
  2. 【资产管理】-【项目信息】查看到 项目编号
  3. 查看 app_idapp_key

依据x-utest系统提供的API进行接口调用,可将 判定测试 的结果上传到 测试报告系统服务器 数据库,即可生成 软件系统量化线路图精美测试报表服务

有效工作流

开发工作流

大家都试着构想过这样一种工作流:

  1. 小组成员一起开会设计好系统
  2. 定义好接口并形成书面文档
  3. 开发人员负责 软件功能项目 和测试人员负责 测试用例项目,同步开发
  4. 长时间的小步快速开发和迭代,功能和用例数都不断增长
  5. 功能项目的目标是让所有的测试用例都通过
  6. 最终达成团队的预期目标,项目上线

工程流程图如下:

_images/xtest-work-flow.png

流程优势

以上工作流的好处如下:

  1. 开发和测试同步进行,人员得到最大化利用
  2. 让小步和快速迭代上线成为可能,极大降低了项目无谓的消耗和项目失败的风险
  3. 每个过程都严格的让测试用例对软件质量进行了有效把控
  4. 测试用例的总数和成功总数对软件这个黑盒形成了良好的 量化
  5. 整个开发过程和进度对于 不懂技术 的团队成员也是 完全透明

整个过程用两句话可以描述:

  1. 测试 驱动 开发
  2. 测试 量化 开发

当然,一个IT企业,做到以上是非常不容易的,但是可以朝向这个方向不断前进。

本文先介绍一个系统来助力IT企业实现这一目标。在实现这一目标之前,先达成一个小目标:

让企业重视软件质量,提升软件质量控制的 技术和方法论 ,让软件测试活动变得 流行 起来,让软件测试成为整体软件生产活动中的 高频事件

为了上述的小目标落地,那么先要到如下几点:

  1. 让软件测试工作确实起到 量化 开发过程的作用
  2. 加速测试重要产出物 *测试报告 的曝光度和传播度

三方系统

借助 x-utest系统 可以有效实现这个目标:

  1. 测试开发人员完成自动化测试项目的编写
  2. 提取测试项目的报告
  3. 按照 x-utest系统 组织成 规范的报告格式
  4. 上传测试报告到 x-utest系统
  5. 根据时间线形成完整的 产品成长量化图
  6. 形成直观的 测试报告分享报表,直接分享给协作人员查看

基本理论和开发规范

概念陈述

目前软件测试行业的理论和细分领域层出不穷,主要包括以下几方面:

  1. 判定测试
  2. 压力测试
  3. 响应测试
  4. 安全测试

本文只讲 判定测试 这个领域的内容。

所谓的 判定测试 包括如下几类:

  1. 界面自动化
  2. 接口自动化
  3. 单元自动化

其实这就是 分层自动化金字塔 中的三层。

_images/auto-test-by-layer.png

它们的共同点就是:对于一个定义数据和定义的执行过程通常会有一个预期输出,如果实际输出和预期输出不同,则定义为Flase,否则为True。

所以,基于以上特点,都可以归结到 “判定测试” 的概念里面来,可以生成一样的 测试报告产出物,都适用于本文提到的 x-utest系统

此处的 判定测试 的测试场景和类别包括且不限于:

  1. 单元测试
  2. 接口测试
  3. UI测试
  4. 环境测试

只要是涉及到:

  1. 测试用例
  2. 测试套件
  3. 测试结果
  4. 测试详情

都可以使用本系统生成报表并存储历史测试数据。

开发规范

为了达到上述的预期效果,有一些基本的开发规范需要地团队共同遵守。

  1. 良好分层的软件系统架构
  2. 明确的版本管理体系
  3. 形成良好信息流的基础软件功能

分层架构

前面提到了 软件的分层金字塔 结构,是目前主流互联网公司的所推崇的基本结构。 很多无法推进自动化测试的软件系统,大部分问题都出在这儿了,需要好好设计一下。

版本管理

所谓的版本管理,其实目标就是:明确被测对象。

一个软件系统从开始到结束它的名字基本上是不会变的,但是每个时期,只要是任何代码的改变,其实它都是变化的。对外展现的是不变性,对内则一定要进行好的区分。

被测对象版本号的重要性。每次提测而且需要记录备案的软件系统必须是独一无二的,拥有唯一的代号,即: 版本号

关于版本号的命名方式,业界有很我成熟的方法,在此不再赘述。只要满足如下要求即可:

  1. 保证版本号的唯一性
  2. 从字面意思可以看得到版本的演进和迭代顺序

基础功能

形成流畅的信息流的前提是:所有的过程尽量能够自动化。

对于测试人员来说,有两样东西非常重要:

  1. 被测对象版本号及特性信息
  2. 运行相关环境及软件库依赖

服务端接口 作为被测试对象的 自动化测试 过程为例子,开发人员必须至少提供一个接口:

  • 显示应用程序内部信息的接口。

对于该接口的定义,下面给出一个示范:

  • 接口名称
    /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哈莫

RobotFramework

todo

感谢:

  • @abbott

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的步骤操作。

感谢:

  • @凯哥

doraemon

一个基于Python的测试项目。

使用文本文件写自动化测试用例

下载方式:

git clone git@github.com:TesterlifeRaymond/doraemon.git

感谢:

  • @mock哥

其它

如果有其它平台的演示,欢迎大家联系管理员进行贡献,谢谢大家。

所有的贡献者都会加入到本项目的感谢名录中。

学习和交流

学习资料

如果有对测试开发还没入门的小白用户,这里面有免费的精品资料(精美文档和视频资料)。

基于python的互联网软件测试开发(自动化测试)-全集合

http://www.cnblogs.com/beer/p/6381327.html

这些文档和资料虽然是免费,但是却饱含作者的心血,耗时耗力才完工。请大家珍惜,下载下来后认真学习。

bug汇报或改进建议

提交issues

https://github.com/x-utest/xtest-server/issues

交流QQ群

一直苦于没有接口自动化项目实战经验的朋友,欢迎加入和讨论。

如果有兴趣一起交流的的朋友,可以加入 互联网软件测试开发QQ群 :207548681

管理员QQ

  • Harmo哈莫
  • QQ:1295351490

讨论群:

QQ群:547955053,欢迎搜索加入!

或扫描二维码加群:

_images/qq-group.jpg