65.9K
CodeProject 正在变化。 阅读更多。
Home

Java API 性能测试

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (4投票s)

2013年2月14日

GPL3

4分钟阅读

viewsIcon

27191

使用 LoadRunner 进行 Java API 性能测试

引言

我搜索了很多地方来了解 Java API 性能测试的知识,但问题是我找不到任何具有建设性的分步过程。这促使我开始记录下这些步骤,希望能帮助到其他人。

我之前已经使用 Java API 实现过,并在 LoadRunner 中执行了可伸缩性、可靠性以及各种其他性能测试。

先决条件:

  • 期望您对 Java 开发有所了解。您可能不是一个优秀的开发者,但应该比“Hello World!”程序了解得更多。
  • 您应该了解性能测试工具,例如 LoadRunner。
  • 您应该拥有任何 Java 开发 IDE,例如 NetBeans。

要求

  • 您需要 Java API(通常是 jar 格式),您将对其进行性能测试。
  • 您通常需要 Java API 的文档,这将帮助您理解 API。
  • 您需要性能测试工具,在本例中我们将使用 LoadRunner。但它并不局限于 LoadRunner,也可以用于其他性能测试工具。
  • 您需要 Java 开发 IDE,在本例中我们将使用 NetBeans。虽然不是必需的,但它能帮助我们编写无错误的代码,并稍后方便地复制粘贴到性能测试工具中。在 NetBeans 中编写 Java 代码比在 LoadRunner 中编写有几个优势。
  1. 轻松地将 API 添加到 NetBeans 项目中。
  2. NetBeans 会自动导入所需的包。
  3. 以无障碍的方式调试代码。
  4. 毫不费力地使代码无错误。

注意
在开始编写 Java 代码之前,请确保您在 NetBeans 中编写的所有内容都可以复制并被 LoadRunner 理解。

性能场景

假设您有一个 API(例如 SumitAPI.jar),它由您的项目开发团队提供,您负责在 100 个用户并发运行 2 小时,思考时间为 10 秒的情况下,为其提供性能指标。

事务详情

  • 使用 Java API 登录 Web 服务器
  • 获取所有服务器池 ID
  • 获取所有服务器连接 ID
  • 退出 Web 服务器

开始在 NetBeans 中编写代码

在 NetBeans 中,点击 文件 -> 新建项目
选择 Java -> Java 应用程序,然后点击 下一步
输入项目名称为“Sumit_Api_Example”,选择项目位置,勾选“创建主类”复选框,然后点击 完成
新项目将被创建。
右键点击项目下的库 (Libraries),然后选择 添加 Jar/文件夹
选择开发团队提供的 jar 文件。在本例中是 SumitAPI.jar。
展开库 (Libraries) 的树状结构,您将找到 JDK 以及您刚刚添加的 jar 文件。

注意
API(在本例中为 SumitAPI.jar)或下面的代码将与您的性能测试脚本不匹配。这篇博文仅帮助您了解如何执行 Java API 的性能测试。您将有不同的 API,它们有不同的类、方法和属性,您需要编写 Java 代码来在 LoadRunner 中执行。
理解您的 API 的最佳方法是查阅 Java API 文档,该文档应由开发团队在交付 API 时提供。

package sumit_api_example;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.net.ssl.*;
import sumit.api.computeservice.client.OvmWsClient;
import sumit.api.computeservice.client.OvmWsClientFactory;
 
public class Sumit_Api_Example
{
     static OvmWsClient objOvmWsClient;
 
     public static void main(String[] args)
    {
          try
         {
            //Login
            System.out.println("Login...");
            objOvmWsClient = OvmWsClientFactory.getOvmWsClient("SOAP");
            objOvmWsClient.setDebug(false);
            objOvmWsClient.setDialect("XML");
            objOvmWsClient.initialize("http://xxxxxxxx.com", "7001", true);

            objOvmWsClient.login("UserName", "Password", Locale.getDefault());
 
            //Get All Server Pool IDs
            System.out.println("Get All Server Pool IDs...");
            List<ServerPool> serpools = objOvmWsClient.serverPoolGetAll();
            for (ServerPool serpool : serpools)
            {
                System.out.println(serpool.getId().toString();
            }

            //Get All Server Connection IDs
            System.out.println("Get All Server Connection IDs...");
            List<ServerConnection> sercons = objOvmWsClient.serverConnectionGetAll();
            for (ServerConnection sercon : sercons)
            {
                System.out.println(sercon.getId().toString();
            }

            //Logout
            System.out.println("Logout...");
            objOvmWsClient.logout();
        }
        catch(Exception ex)
        {
            System.out.println(ex);
        }
    }
}

运行项目,它应该能够成功运行。它应该连接到 Web 服务器,显示所有服务器池 ID 和服务器连接 ID,然后退出。一旦您对输出和期望的结果满意,就可以将其复制粘贴到 LoadRunner 中了。

注意
import sumit.api.computeservice.client.OvmWsClient;import sumit.api.computeservice.client.OvmWsClientFactory; 来自 SumitAPI.jar。OvmWsClientserverPoolGetAll() 是 SumtAPI.jar 中的各种类和方法。

将以上代码复制粘贴到 LoadRunner 中

在本节中,我们将使用 Java Vuser 协议将从 NetBeans 中可运行的代码复制粘贴到 LoadRunner 中。我们将添加 SumitAPI.jar,然后修改代码,使其能被 LoadRunner 识别。我们还将添加参数和其他功能,以便为 API 进行负载测试,模拟 100 个用户并发运行 2 小时。

点击 插入 -> 在 VuGen 中插入 Java 函数
点击 位置 (Location) 按钮
点击 浏览 (Browse) -> 文件 (File) 打开 jar 文件(在本例中是 SumitAPI.jar)
选中 jar 文件的复选框,然后点击 确定 (OK) 按钮
点击 关闭 (Close) 按钮,SumitAPI.jar 已被添加到脚本中。

import lrapi.lr;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.net.ssl.*;
import sumit.api.computeservice.client.OvmWsClient;
import sumit.api.computeservice.client.OvmWsClientFactory;

public class Actions
{
    OvmWsClient objOvmWsClient;

    public int init() throws Throwable
    {
    try
    {
        lr.start_transaction("SumitAPI_01_Login");
        //Login
        objOvmWsClient = OvmWsClientFactory.getOvmWsClient("SOAP");
        objOvmWsClient.setDebug(false);
        objOvmWsClient.setDialect("XML");
        objOvmWsClient.initialize("http://xxxxxxxx.com", "7001", true);
   
        objOvmWsClient.login(<UserNames>, "Password", Locale.getDefault());
        lr.end_transaction("SumitAPI_01_Login", lr.AUTO);

        lr.think_time(10);
    }
    catch(Exception ex)
    {
        System.out.println(ex);
    }
    return 0;
    }


    public int action() throws Throwable
    {
    try
    {
        lr.think_time(10);

            lr.start_transaction("SumitAPI_02_ShowAllServerPoolIDs");
        //Show All Server Pool IDs
        lr.message("Show All Server Pool IDs...");
        List<ServerPool> serpools = objOvmWsClient.serverPoolGetAll();
        for (ServerPool serpool : serpools)
        {
            lr.message(serpool.getId().toString());
   
        }
        lr.end_transaction("SumitAPI_02_ShowAllServerPoolIDs", lr.AUTO);

        lr.think_time(10);

        lr.start_transaction("SumitAPI_03_ShowAllServerConnectionIDs");
        //Show All Server Connection IDs
        lr.message("Show All Server Connection IDs...");
        List<ServerConnection> sercons = objOvmWsClient.serverConnectionGetAll();
        for (ServerConnection sercon : sercons)
        {
            lr.message(sercon.getId().toString();
   
        }
        lr.end_transaction("SumitAPI_03_ShowAllServerConnectionIDs", lr.AUTO);
    }
    catch(Exception ex)
    {
        System.out.println(ex);
    }
    return 0;
    }


    public int end() throws Throwable
    {
    try
    {
            lr.think_time(10);

        lr.start_transaction("SumitAPI_04_Logout");
        //Logout
        lr.message("Logout...");
        objOvmWsClient.logout();
        lr.end_transaction("SumitAPI_04_Logout", lr.AUTO);
    }
    catch(Exception ex)
    {
        System.out.println(ex);
    }
    return 0;
    }
}

注意
请注意,在 LoadRunner 中已移除 static 关键字,因为它不是从 static main 方法调用的。已定义事务名称。为用户名提供了参数。通常参数用 {} 分隔,但这里设置为 <>。这可以在 VuGen 的 工具 -> 常规选项 -> 参数化 中进行配置。已提供思考时间,最后但同样重要的是,事务已被归类为 init()、action() 和 end()。

运行 LoadRunner 脚本 2 次迭代,检查操作是否成功。至此,我们的 LoadRunner 脚本已准备就绪,可以根据定义的场景在 LoadRunner 控制器中执行。

兴趣点 

请始终确保您在 NetBeans 中编写的任何代码都可以转换为 LoadRunner 中的代码。

历史

这是第一个版本。

© . All rights reserved.