墨测,全自动化接口测试平台

1. 自动化测试面临的挑战

在软件开发周期中,测试是保障产品质量至关重要的一环,但也是往往容易被忽视的一环,测试的工期置后、重复回归执行等各种因素都影响着测试的效率,影响着高质量的产品发布。

自动化测试被认为是提高测试质量和效率的法宝,通过自动化测试平台,可以实现用例的编写、数据的准备、测试执行、结果验证,将测试工作通过脚本的方式重复执行,但是仅仅如此是不够的,测试还面临着如下的挑战,

  1. 用例的编写:测试在软件开发周期中,由于处于项目排期偏后,经常导致测试只有时间来了解新功能,却没有足够的时间来写自动化用例脚本,工期紧,自动化只能等下一次排期,进而一拖再拖。
  2. 用例的维护:软件产品的功能繁多、变化频繁,用例不是写一次就结束,用例的维护也需要花费测试人员相当多的时间,即使对一个资深软件测试工程师,也难以记住所有需要测试的功能接口,上个月刚测完的功能接口,本月再看,估计又需要大半天来上手的时间。
  3. 问题的定位:在微服务系统中,一不小心就会拆分出上百个应用,每个功能接口涉及的应用多、调用链路长。自动化测试跑完后,需要对失败的用例进行查看,其到底是不是软件bug?是用例的数据问题、或环境应用部署问题?面对失败的用例一个个调查时,查看运行日志,有时候还得需要开发人员的加入,一起来定位问题。自动化测试执行容易,用例失败问题定位困难重重。
  4. 环境的稳定性:测试环境本身就是不稳定的,每天需要测试的产品部署配置频繁,加上团队对测试环境的共享,会造成很多由于测试环境的不稳定导致的无效测试,很多时候等到测试到一半的时候,才发现环境不对。

通过Mysql分析Redis的内存快照数据

图片来自pixabay.com的mrgajowy3会员

本文描述了如何将Redis的内存快照数据导出,然后导入到Mysql,通过Mysql实现对Redis的内存数据分析,获取键值总数、内存消耗最大键值等信息。

1. 环境版本

本文的演示环境如下,

  • Mysql 5.7(安装在windows)
  • Python 3.6(安装在linux)
  • Redis 3.2.5(安装在linux)

2. 获取Redis内存快照

登录Redis客户端,执行bgsave命令,此命令将当前Redis的内存快照保存为dump.rdb文件

$ ./redis-3.2.5/bin/redis-cli -h localhost
localhost:6379> bgsave
Background saving started

Redis服务端将显示如下日志,

8961:M 01 Apr 21:12:06.419 * Background saving started by pid 9505
9505:C 01 Apr 21:12:06.440 * DB saved on disk
9505:C 01 Apr 21:12:06.441 * RDB: 0 MB of memory used by copy-on-write
8961:M 01 Apr 21:12:06.533 * Background saving terminated with success

生成的dump.rdb文件位于,

  • 缺省文件位置:./redis-3.2.5/bin/dump.rdb
  • 自定义文件位置:见redis.conf文件中的配置项dbfilename dump.rdb,该配置项可以改变dump.rdb文件的保存位置。

3. 通过rdb工具导出csv格式数据

3.1 安装rdb工具

工具rdb是一个Python工具,需要预先安装Python,然后执行如下命令,

# 创建虚拟环境
python -m venv venv

1. 激活虚拟环境
1. - 在windows系统
venv\Scripts\activate.bat
1. - 在linux系统
source venv\Scripts\activate

1. 安装依赖
pip install rdbtools
pip install python-lzf

注1:Windows7上安装rdbtools,会出现如下报错信息。根据提示,rdbtools需要安装Microsoft Visual C++ 14.0。

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/

注2:安装python-lzf,这是由于在下一步解析dump文件时,该工具能够加快解析速度。不安装的话,将会有提示信息:Parsing dump file will be very slow unless you install it。

3.2 导出csv格式数据

在安装rdbtools好了后,执行如下命令,通过rdb工具解析dump文件为csv文件。

rdb -c memory dump.rdb > memory.csv

打开memory.csv文件,可以看到里面内容格式如下,

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,string,username,72,string,8,8,
0,string,test,48,string,8,8,
......

里面包括了如下的redis键值信息,

  • 数据库
  • 键类型
  • 键名
  • 占用内存空间大小
  • 编码
  • 元素个数
  • 最大元素大小
  • 失效时间

接下来就可以将memory.csv文件导入到Mysql进行下一步的统计分析。

4. 导入csv内存快照数据到Mysql

  1. 打开Mysql客户端,执行如下sql(请预先创建好数据库datareport),创建表memory,
    DROP TABLE IF EXISTS `datareport`.`memory`;
    create table IF NOT EXISTS `datareport`.`memory` (
    `database` int,
    `type` varchar(128),
    `key` varchar(128),
    `size_in_bytes` int,
    `encoding` varchar(128),
    `num_elements` int,
    `len_largest_element` int,
    `expiry` varchar(128),
    KEY `idx_type` (`type`),
    KEY `idx_key` (`key`),
    KEY `idx_size_in_bytes` (`size_in_bytes`),
    KEY `idx_num_elements` (`num_elements`),
    KEY `idx_len_largest_element` (`len_largest_element`)
    );
    
  2. 复制文件memory.csv到C:/ProgramData/MySQL/MySQL Server 5.7/Uploads目录下。
    • 打开复制的memory.csv文件,删除如下第一行表头数据。
    database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
    
  3. 执行如下sql命令,加载csv数据到表
    LOAD DATA INFILE'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/memory.csv' replace INTO TABLE `datareport`.`memory` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n';
    
    根据数据文件大小和机器配置,该加载过程时间会比较长,150MB的memory.csv文件耗时可能达1个小时。

Redis缓存组件开发规范

图片来自pixabay.com的katja会员

1. 简介

Redis是业界流行的缓存组件,为了规范Redis缓存的使用,避免落入各种问题陷阱,特此编写了此开发规范。本规范结合实际情况,描述了需要遵守的Redis最佳使用规约,及其供参考的最佳实践,供研发团队在项目开发中使用。

本文将出现如下规约术语,其中根据约束力强弱,规约分别有如下三级, 【强制】必须遵守的规约 【推荐】推荐遵守的规约,若无特殊情况,需要遵守该规约 【参考】参考遵守的规约,团队根据实际情况,可以选择性的遵守

每一个规约,根据情况,将有如下附加说明,

  • 说明:对规约进一步的引申和解释
  • 正例:提供一个正面遵守规约的样例
  • 反例:提供一个规约的反面样例,以及真实的错误案例,提醒误区

2. 规约

2.1 键值设计

  1. 【强制】键的命名使用英文小写和冒号、下划线、数字,其中冒号和下划线不能作为键名的开始和结束,而冒号为命名空间分隔符。不要使用中文和特殊字符作为健名。
    • 正例:”pphh:account:user1″
    • 反例1:”pphh.账号-USER1″,该反例使用了点、中文、中划线、英文大写。
    • 反例2:”:pphh:account:user1_”, 该反例使用了冒号和下划线作为开始和结束
  2. 【推荐】键的命名尽量简单、清晰、易懂,长度尽量控制在32个字符以内,不要超过64个字符。
    • 说明:长的键名不仅消耗内存空间,而且会影响键的搜索查询速度。为了保证键的可读性,也不推荐太短的键名,比如”u1000flw”,可以使用”user:1000:followers”来表达。
    • 反例1:”pphh:account:loooooooooooooooooooooooooooooooooooooooooog:name”
  3. 【推荐】键的命名空间分为三级,格式为 {系统简称}:{应用名}:{业务健名},命名空间通过冒号区分,公共键值以common表示。
    • 正例1:”web:home_page:click”
    • 正例2:”common:user_login:verification_code”
    • 反例3:”web_home_page_click”
  4. 【推荐】键的值存储空间大小尽量在10KB以内,不推荐存储大于1MB的值。
  5. 【推荐】对于列表键(Hash、List、Set、Zset),尽量控制元素个数不超过千万数量级,若大于这个数量级,建议通过键值切分列表。

  6. 【推荐】建议List当做队列来使用。