上篇博客介绍了如何调用接口准备测试数据,此篇博客介绍了如何通过操作数据库准备测试数据以及如何通过csv或者json文件管理静态测试数据。为了完成本次课程目标,拆分了2个task
- 操作数据库准备测试数据
- 利用csv或者json文件管理静态测试数据
接下来就开始第一个task吧。案例中是以mysql数据库为例进行讲解,如果需要连接其他类型的数据库,请按案例中的思路查阅资料实现。为了连接数据库,并对数据进行增删改查,首先执行“npm install mysql”命令安装mysql包,安装完成后即可引入该包完成数据库操作。
在编写js脚本实现操作数据库前,请先在本地安装好mysql server,创建名称为“test”的数据库并保证能正常连通数据库,数据库创建后,执行如下的语句创建数据库表。
CREATE TABLE IF NOT EXISTS `user`(
`id` INT UNSIGNED AUTO_INCREMENT,
`username` VARCHAR(100) NOT NULL,
`age` INTEGER NOT NULL,
`create_date` DATE,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
初始化table成功后,即可开始编写操作数据库的脚本了,具体代码如下所示,同样,执行"npm run select-db-data"即可运行下面的案例。
数据库操作部分拆分了2个js文件,第一个js文件负责存放数据库的连接信息,第二个js文件才真正负责数据的增删改查。以下是第一个js文件“init-db.js”。
const mysql = require('mysql');
//安装mysql包后,引入mysql,供后面使用
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "root123456",
database: "test"
});
//固定写法,这里用户名和密码请填写你本机安装mysql时设置的用户名和密码
connection.connect(function (err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
//创建数据库连接,调试时可以调用该方法先保证connection能正常创建
module.exports = {
connection: connection
};
//导出常量connection,供其他js文件使用
以下是第二个js文件“select-db-data.test.js”,具体代码如下所示
const db = require('./init-db');
// 引入上面的js文件,因为要使用init-db.js中的connection常量
function getUserDataByUserName(username) {
db.connection.query('select * from user where username=?', [username], function (error, results) {
//connnection.query('sql',[value],function(){})固定写法,sql语句中需要传参的地方用?,[]中输入要传入的参数值
if (error) throw error;
console.log(JSON.parse(JSON.stringify(results[0])).username);
//调用JSON.parse()将查询的结果转化为Json对象,这样就可以获取结果中任意字段的值,这里是获取查询结果中username字段的值
});
}
function addUser(username, age) {
db.connection.query('insert into user(username,age) values (?,?)', [username, age], function (error) {
//往表里面增加数据
if (error) {
throw error
}
})
}
function updateUserAge(username, age) {
db.connection.query(
{
sql: 'update user set age=? where username=?',
timeout: 3000,
values: [age, username]
// query()的另外一种写法,用json字符串方式传入query()中需要的sql,value等信息,这里还可以指定执行sql的超时时间
}, function (error, results) {
if (error) {
throw error
}
console.log('update ' + results.affectedRows + ' rows');
//这里还可以获取此次sql执行,影响的行数
console.log('changed ' + results.changedRows + ' rows');
//获取此次sql执行,被修改的行数,changedRows与affectedRows的区别是,只有某行数据确实被修改,changedRow数据才会增加
}
)
}
function closeConnection() {
db.connection.end();
//关闭数据库连接
}
getUserDataByUserName('zhangshan');
addUser("lisi", '20');
updateUserAge('lisi', 66);
closeConnection();
调用上面的方法,执行结果如下图所示,可以看到通过username正确获取到了用户信息以及成功添加和更新table中信息。执行结果如下图所示
如果安装mysql 8,在执行过程中可能会运行失败并提示“Client does not support authentication protocol requested by server”。报此错误的原因是Nodejs中最新的mysql模块(即安装的mysql包)并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式,故运行的时候会报错。解决办法是执行如下语句,显示指定使用“mysql_native_password”的加密方式。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root123456';
// 注意这里替换成自己本机安装的用户名和密码
以上就是操作mysql数据库案例,更过关于nodejs中mysql包的使用可查看官方文档“ https://github.com/mysqljs/mysql ”。接下来开始第二个task的学习。
csv或者json文件管理静态测试数据
何为静态测试数据呢?即在运行案例前就可以确定且不会经常改变的测试数据。例如有个注册场景,注册时需要的用户名、别名等信息是可以提前确定的,这类测试数据需要用文件管理起来,当准备测试数据时从文件中直接读取,当这类测试数据因为业务变化需要修改时只需修改文件中内容即可。
另外,如果这类数据与环境有关,还需要按环境分别管理,这样当切换环境后,可以读取对应环境下的测试数据文件内容。例如,需要测试通过订单号查看订单详细的功能,订单号来源于第三方系统,不同环境下第三方系统固化的测试订单编号肯定不同,那么需要把订单号按环境用文件管理起来。自动化测试中通常用csv文件管理测试数据,接来下就开始学习如何读取csv文件中内容。
为了读取csv文件中内容,可以安装和引入“csvtojson”,这样读取csv文件内容更简单。同样,执行“npm run readCsv”即可运行下面的案例
const csvToJson = require('csvtojson');
//安装csvtojson后,引入该包供后面使用
async function readCsv() {
const data = await csvToJson().fromFile('./testdata/data.csv');
//读取csv文件中数据,这里文件目录是基于代码根目录的相对目录
data.forEach(it => {
if (it.role == "normal") {
console.log(it.name);
console.log(it.age)
}
});
//获取文件内容后,可以调用forEach()获取满足条件的内容,例如data.csv文件中存放user信息,这里按角色获取某个角色的用户信息
const rest = data.find(it => it.role == "manager");
console.log(rest.name);
console.log(rest.age);
//调用find()方法获取role==manager的用户信息
}
readCsv();
//调用上面的包好的方法
除了用csv文件管理静态数据,也可以用json文件管理静态数据,这两个方式如何取舍呢?如果数据量很大建议用csv文件管理,因为如果json文件存放大量内容,可读性比较低;如果数据量很小,可以用json或者csv,json文件管理测试数据的一个小优势是:在读取数据信息时会更简单。例如,假设需要管理userInfo,如果用csv文件管理,内容如下
username,password,roleName
Done,222,systemManager
David,111,manager
Echo,333,normalUser
测试场景中需要根据被测场景获取不同角色的用户信息,如果用csv管理,以登陆场景为例,伪代码如下
async function login() {
const filePath=‘./testdata/data.csv’
const data = await csvToJson().fromFile(filePath);
const userData = data.find(it => it.role == "manager");
login(userData.username,userData.password)
如果用json文件管理上面的静态数据,json文件内容如下
{
"systemManager":{
"username":"Done",
"password":"222"
},
"manager":{
"username":"David",
"password":"111"
},
"normalUser":{
"username":"Echo",
"password":"333"
}
}
还是相同的场景,读取user信息进行登陆,伪代码如下所示,可以看到相比csv文件,json文件管理测试数据时无需使用find进行查找,直接读取即可。
async function login() {
const filePath=‘./testdata/data.json’
const data = await JSON.parse(fs.readFileSync(filePath))
login(data.manager.username,userData.manager.password)