微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有多个参数的 Java JMH 运行方法

如何解决带有多个参数的 Java JMH 运行方法

我正在尝试对负载下的 Web 应用程序进行性能测试。我想增加用户数量以检查这将如何影响系统的行为。我打算使用 JMH 和 Java。我已经写好了打开浏览器并登录代码,这里是:

@Threads(3)
    @Benchmark
    //@BenchmarkMode(Mode.All)
    public static boolean testLogin() throws IOException {
        count = count +1;
        System.setProperty("webdriver.gecko.driver","firefoxdriver\\geckodriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.setAcceptInsecureCerts(true);
        //options.setHeadless(true);

        //driver = new ChromeDriver(options);
        FirefoxOptions firefoxOptions = new FirefoxOptions();
        firefoxOptions.setAcceptInsecureCerts(true);
        WebDriver driver = new FirefoxDriver(firefoxOptions);
        driver.manage().window().maximize();

        //wait = new webdriverwait(driver,10,1);
        //initializeDriver();


        login = new Login(driver);

        Pair<String,String> user = users.get(count);
        String username = user.getKey();
        Strings password = user.getValue();


        //System.out.println(username+"  - -  "+password);

        login.login(username,password);

        driver.close();

        return true;
        //return null;
    }

以及从文件中读取所有用户凭据的设置方法

static ArrayList<Pair> users;

static int count;
@Setup
    public void readUsers(){
        String line = "";
        String split_by = ",";
        BufferedReader bufferedReader;

        users = new ArrayList<>();
        
        try {
            bufferedReader = new BufferedReader(new FileReader("users/users.csv"));
            line = bufferedReader.readLine();

            while ((line = bufferedReader.readLine()) != null) {
                String[] user_entry = line.split(split_by);
                Pair<String,String> user;
                String username = user_entry[2];
                String password  = user_entry[3];

                user = new Pair<>(username,password);
                users.add(user);

                //System.out.println(username +"  - -  "+password);
            }
        } catch (IOException e) {
            e.printstacktrace();
        }

        count = 0;
    }

现在我的问题是如何使用一组不同的用户名和密码运行登录方法,因为系统一次只允许一个用户进行一个会话。我不知道如何将值传递给 login 方法。我尝试使用整数索引从 ArrayList 检索 User 对象,但是使用线程运行代码会一遍又一遍地调用相同的值。我该如何解决这个问题。将不胜感激。

解决方法

您可以为每个测试线程创建一个唯一的对象。

@State(value = Scope.Thread)
public static class ThreadState{
    String loginid;
    @Setup(Level.Trial)
    public void setup(){
           loginid = ... // load some unique login id
    }

    @TearDown(Level.Trial)
    public void teardown(){}
}

@Benchmark
public void testLogin(ThreadState state){
   String loginid = state.loginId;
   ... 
}

JMH 将为每个工作线程创建一个此 ThreadState 的实例,您可以在此处添加“每个线程”状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。