问题描述
我正在尝试对负载下的 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 的实例,您可以在此处添加“每个线程”状态。