51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2387|回复: 1
打印 上一主题 下一主题

[讨论] 在JMeter中实现数据驱动测试

[复制链接]
  • TA的每日心情
    无聊
    4 小时前
  • 签到天数: 58 天

    连续签到: 1 天

    [LV.5]测试团长

    跳转到指定楼层
    1#
    发表于 2018-5-30 16:53:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    Data Driven Testing (DDT)即数据驱动测试,是一种用于创建自动化测试的方法,或者换句话说,是一种架
    构。这种方法的本质是,测试输入的数据和用这些数据获得的结果,与测试本身分开存储。存储输入数据和
    结果的是Excel文件。写入Excel文件的结果是我们成功通过测试的预期结果。

    DDT的一个优点是测试人员不必为每一个输入数据创建一个单独的测试。测试在一个实例中创建,并且输入
    数据和用于与实际结果进行比较的预期结果从文件中获取。

    为了使用DDT创建一个测试,假设我们有一个接受用户的LOGIN和PASSWORD作为传入值的API。

    对于API,存在以下要求:用户登录名只能包含英文字符。否则,请在API响应中返回以下错误消息:“用户登
    录输入错误”。

    一、下载jar包

    在Jmeter中创建测试之前,我们首先需要下载如下jar包,并将其拷贝到jmeter的lib目录中:

    Apache POI 3.17
    Apache POI-OOXML 3.17
    Apache Commons IO 2.6
    OOXML Schemas 1.3
    Apache Commons Collections 4.1
    XmlBeans 2.6
    二、创建一个如下图所示的Excel文件:

    在这个文件中,从第二行开始的每一行都是我们的测试用例。 填写以下字段:

    测试用例描述 - 手动填写
    登录 - “登录”参数的值,用于形成对API的请求
    密码 - “密码”参数的值,用于生成对API的请求
    请求 - 在此列中,JMeter将向API写入请求
    实际结果 - 在此列中,JMeter将写入API的响应
    预期结果是我们期望从API获得的结果。 手动填写
    状态 - 在此列中,JMeter将记录测试用例通过或未通过的状态
    基于上述Excel文件,我们将执行7个测试用例。 对于每个测试用例,我们都希望API有以下响应:“{" me
    ssage ":" User login is not entered correctly "}”,因为根据我们的要求,登录不能包含英文字符。

    创建的Excel文件可以保存在任何目录中。
    三、Jmeter配置

    1.Right Click -> Add -> Threads(Users) -> Thread Group
    2.Thread Group -> Right Click -> Add -> Config Element -> User Defined Variables
    创建一个名为“pathToFile”的变量,变量的值为我们上面存储Excel文件的路径:

    3.根据excel文件创建一个Workbook对象
    Thread Group -> Right Click -> Add -> Sampler ->JSR223 Sampler

    添加如下代码示例:

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import java.io.*;

    XSSFWorkbook book = "";

    try {

        InputStream inputStream = new FileInputStream(new File("${pathToFile}"));
        book = new XSSFWorkbook(inputStream);
        inputStream.close();

    } catch (Exception e) {

         log.info("!!!!!!!!" + e.getMessage() + "!!!!!!!!!!!!!!!");
    }

    if (!book.equals("")) {

        vars.putObject("book", book);      

    } else {

        SampleResult.setStopTestNow(true);  
    }
    4.添加一个While Controller

    While Controller将用于向API发送请求的次数与我们的Excel文件包含的传入数据的行数相同。 在我们的用例中,是七次。

    Thread Group -> Right Click -> Add -> Logic Controller -> While Controller*

    添加如下代码:

    ${__javaScript("${stopWhile}" != "OK")}  #此代码用于停止While Controller

    5.添加一个Counter
    While Controller -> Add -> Config Element -> Counter


    Start = “1” is the initial value that is assigned to the variable "counter" before sending the first request to the API.
    Increment = “1” is the value that is added to the value of the variable "counter" before sending the second request to the API.
    Reference Name = "counter" is the name of the variable
    While Controller -> Right Click -> Add -> Sampler -> JSR223 Sampler

    在这一步中,我们从对象,单元格值的行中获取字符串,并将这些值存储在变量中。
    添加如下代码:

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import java.io.*;

    int i = Integer.parseInt(vars.get("counter"));

    XSSFRow row = vars.getObject("book").getSheetAt(0).getRow(i);
    vars.putObject("row", row);

        for (int j = 1; j <= vars.getObject("book").getSheetAt(0).getRow(0).getLastCellNum(); j++) {

            if (row.getCell(j) == null) {
                row.createCell(j).setCellValue("");
            }
        }   

        String login = row.getCell(1).toString();
        vars.put("login",login);

        String password = row.getCell(2).toString();
        vars.put("password",password);

        String expectedResult = row.getCell(5).toString();
        vars.put("expectedResult",expectedResult);
    7.While Controller -> Add -> Sampler ->jp@gc-Dummy Sampler
    此步骤的目的是模拟测试的服务。

    Example code:

    {"login":"${login}", "password":"${password}"}
    {"message":"User login is not entered correctly"}

    Dummy Sampler -> Right Click -> Add -> Assertions -> BeanShell Assertion
    此步骤比较API的实际响应和预期响应,并在工作簿对象中记录请求,响应和状态。
    添加如下代码:
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import java.io.IOException;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFRow;

    String requestToApi = SampleResult.getSamplerData();
    String responseFromApi = SampleResult.getResponseDataAsString();
    String status = null;

    if (vars.get("expectedResult").equals(responseFromApi)) {   
        status = "Passed";  
    } else {
        status = "Failed";
    }

    vars.getObject("row").createCell(3).setCellValue(requestToApi);
    vars.getObject("row").createCell(4).setCellValue(responseFromApi);
    vars.getObject("row").createCell(6).setCellValue(status);


    String stopWhile = null;
    int i = Integer.parseInt(vars.get("counter"));

    if (i >= vars.getObject("book").getSheetAt(0).getLastRowNum()) {
        stopWhile = "OK";
        vars.put("stopWhile",stopWhile);
    }

    Thread Group -> Right Click -> Add -> Sampler ->JSR223 Sampler
    此步骤将结果复制到实际的excel文件中。
    代码示例:
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import java.io.*;

    try {

        FileOutputStream out = new FileOutputStream(new File("${pathToFile}"));
        vars.getObject("book").write(out);
        vars.getObject("book").close();

    } catch (Exception e) {

         log.info("!!!!!!!!" + e.getMessage() + "!!!!!!!!!!!!!!!");
    }

    以上就是全部的jmeter配置,整体的目录结构如下图所示:


    运行测试,将所有测试用例结果写入Excel文件后,您的文件将如下所示:




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-20 14:28 , Processed in 0.068265 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表