Why organization scales test suites in JUnit - Automation Benefits in Action
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class LoginTest { WebDriver driver; WebDriverWait wait; void setup() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.get("https://example.com/login"); } void teardown() { if (driver != null) { driver.quit(); } } @ParameterizedTest(name = "Login test for user: {0}") @CsvSource({ "user1, Password1!", "user2, Password2!", "user3, Password3!" }) void testLogin(String username, String password) { setup(); try { WebElement usernameField = wait.until(ExpectedConditions.elementToBeClickable(By.id("username"))); usernameField.clear(); usernameField.sendKeys(username); WebElement passwordField = driver.findElement(By.id("password")); passwordField.clear(); passwordField.sendKeys(password); WebElement loginButton = driver.findElement(By.id("loginButton")); assertTrue(loginButton.isEnabled(), "Login button should be enabled"); loginButton.click(); wait.until(ExpectedConditions.urlContains("/dashboard")); assertTrue(driver.getCurrentUrl().contains("/dashboard"), "URL should contain /dashboard after login"); WebElement logoutButton = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("logoutButton"))); assertNotNull(logoutButton, "Logout button should be visible after login"); logoutButton.click(); wait.until(ExpectedConditions.urlContains("/login")); } finally { teardown(); } } }
This test uses JUnit 5 with parameterized tests to run the login test for multiple users.
The @CsvSource annotation provides three sets of username and password inputs.
In setup(), we open the browser and navigate to the login page.
We wait explicitly for the username field to be clickable before entering credentials.
We assert the login button is enabled before clicking it.
After login, we wait for the URL to contain '/dashboard' and assert it.
We verify the logout button is visible, then click it to logout and wait for the login page again.
Finally, teardown() closes the browser to clean up.
This approach scales well because adding more users only requires adding more lines in the @CsvSource. It avoids repeating code and keeps tests clear and maintainable.
Now add data-driven testing with 3 different invalid login inputs and verify error messages