有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多参数多线程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检索用户对象,但使用线程运行代码会反复调用相同的值。我该如何解决这个问题。我们将不胜感激


共 (1) 个答案

  1. # 1 楼答案

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

    @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将为每个工作线程创建该线程状态的实例,在这里您可以添加“每个线程”状态