Puppeteer之调用数据库准备测试数据

上篇博客介绍了如何调用接口准备测试数据,此篇博客介绍了如何通过操作数据库准备测试数据以及如何通过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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taoli-qiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值