Bird
Raised Fist0
Selenium Javatesting~20 mins

Base test class pattern in Selenium Java - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Base Test Class Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Base Test Class Setup
Consider the following Java Selenium base test class snippet. What will be the output when the test method runs?
Selenium Java
public class BaseTest {
    protected WebDriver driver;

    @BeforeEach
    public void setUp() {
        System.out.println("Setup started");
        driver = new ChromeDriver();
        driver.get("https://example.com");
        System.out.println("Setup completed");
    }

    @AfterEach
    public void tearDown() {
        driver.quit();
        System.out.println("Driver closed");
    }
}

public class SampleTest extends BaseTest {
    @Test
    public void testTitle() {
        System.out.println(driver.getTitle());
    }
}
A
Example Domain
Setup started
Setup completed
Driver closed
B
Setup started
Example Domain
Setup completed
Driver closed
C
Setup started
Setup completed
Driver closed
Example Domain
D
Setup started
Setup completed
Example Domain
Driver closed
Attempts:
2 left
💡 Hint
Remember the order of execution for @BeforeEach, test method, and @AfterEach in JUnit.
❓ assertion
intermediate
1:30remaining
Correct Assertion in Base Test Class
In a base test class, which assertion correctly verifies that the page title contains the word "Example" after navigation?
Selenium Java
public class BaseTest {
    protected WebDriver driver;

    @BeforeEach
    public void setUp() {
        driver = new ChromeDriver();
        driver.get("https://example.com");
    }
}
AassertNull(driver.getTitle());
BassertTrue(driver.getTitle().contains("Example"));
CassertFalse(driver.getTitle().contains("Example"));
DassertEquals(driver.getTitle(), "Example");
Attempts:
2 left
💡 Hint
Check which assertion matches the requirement to verify the title contains a substring.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Base Test Class Setup
What is the main issue in this base test class setup code that causes tests to fail intermittently?
Selenium Java
public class BaseTest {
    protected WebDriver driver;

    @BeforeEach
    public void setUp() {
        driver = new ChromeDriver();
        driver.get("https://example.com");
    }

    @AfterEach
    public void tearDown() {
        driver.close();
    }
}
AMissing @Test annotation on setUp method causes it not to run.
BNot initializing driver in the constructor causes NullPointerException.
CUsing driver.close() instead of driver.quit() causes the browser process to remain open, leading to resource leaks.
DUsing driver.quit() in tearDown causes the browser to close too early.
Attempts:
2 left
💡 Hint
Consider the difference between driver.close() and driver.quit() in Selenium.
❓ framework
advanced
2:30remaining
Best Practice for WebDriver Initialization in Base Test Class
Which approach is best for initializing WebDriver in a base test class to support multiple browsers?
AUse a factory method that reads browser type from a config file and returns the appropriate WebDriver instance.
BHardcode ChromeDriver initialization in the base class constructor.
CInitialize WebDriver in each test method separately for flexibility.
DUse a static WebDriver instance shared across all tests without reinitialization.
Attempts:
2 left
💡 Hint
Think about maintainability and flexibility for running tests on different browsers.
🧠 Conceptual
expert
1:30remaining
Purpose of Base Test Class in Selenium Framework
What is the primary purpose of using a base test class pattern in Selenium test automation?
ATo centralize common setup and teardown code, reducing duplication and improving maintainability.
BTo write all test cases in a single class for simplicity.
CTo avoid using any test framework annotations like @BeforeEach or @AfterEach.
DTo force all tests to run sequentially without parallel execution.
Attempts:
2 left
💡 Hint
Think about how base classes help organize repeated code.

Practice

(1/5)
1. What is the main purpose of using a Base Test Class in Selenium Java testing?
easy
A. To share common setup and cleanup code across multiple test classes
B. To write all test cases in a single class
C. To avoid using WebDriver in tests
D. To make tests run slower for debugging

Solution

  1. Step 1: Understand the role of a base test class

    A base test class contains common setup and cleanup methods that multiple test classes can reuse.
  2. Step 2: Identify the benefit of code reuse

    Sharing setup code avoids duplication and keeps tests organized and maintainable.
  3. Final Answer:

    To share common setup and cleanup code across multiple test classes -> Option A
  4. Quick Check:

    Base test class = shared setup/cleanup [OK]
Hint: Base class holds shared setup and teardown code [OK]
Common Mistakes:
  • Thinking base class holds all tests
  • Ignoring code reuse benefits
  • Confusing base class with utility classes
2. Which of the following is the correct way to declare a base test class in Java for Selenium tests?
easy
A. public BaseTest { WebDriver driver; void setup() { } }
B. class BaseTest { void setup() { WebDriver driver = new WebDriver(); } }
C. public class BaseTest extends WebDriver { void setup() { } }
D. public class BaseTest { WebDriver driver; @BeforeEach void setup() { /* init driver */ } }

Solution

  1. Step 1: Check Java class declaration syntax

    public class BaseTest { WebDriver driver; @BeforeEach void setup() { /* init driver */ } } correctly declares a public class with a WebDriver field and a setup method annotated with @BeforeEach.
  2. Step 2: Identify errors in other options

    class BaseTest { void setup() { WebDriver driver = new WebDriver(); } } misses access modifiers and uses local driver variable incorrectly. public BaseTest { WebDriver driver; void setup() { } } lacks 'class' keyword. public class BaseTest extends WebDriver { void setup() { } } wrongly extends WebDriver, which is an interface.
  3. Final Answer:

    public class BaseTest { WebDriver driver; @BeforeEach void setup() { /* init driver */ } } -> Option D
  4. Quick Check:

    Correct class syntax with setup method = public class BaseTest { WebDriver driver; @BeforeEach void setup() { /* init driver */ } } [OK]
Hint: Look for public class with WebDriver and @BeforeEach setup [OK]
Common Mistakes:
  • Missing 'public' keyword
  • Incorrect class declaration syntax
  • Extending WebDriver interface wrongly
3. Given the following base test class and child test class, what will be printed when running ChildTest.testExample()?
public class BaseTest {
    WebDriver driver;
    @BeforeEach
    void setup() {
        driver = new ChromeDriver();
        System.out.println("Setup done");
    }
    @AfterEach
    void teardown() {
        driver.quit();
        System.out.println("Teardown done");
    }
}

public class ChildTest extends BaseTest {
    @Test
    void testExample() {
        System.out.println("Test running");
    }
}
medium
A. Test running Setup done Teardown done
B. Setup done Test running Teardown done
C. Setup done Teardown done Test running
D. Test running Teardown done Setup done

Solution

  1. Step 1: Understand JUnit lifecycle with base class

    @BeforeEach runs before each test method, @AfterEach runs after. ChildTest inherits these methods.
  2. Step 2: Trace the output order

    First "Setup done" prints from setup(), then "Test running" from testExample(), finally "Teardown done" from teardown().
  3. Final Answer:

    Setup done Test running Teardown done -> Option B
  4. Quick Check:

    @BeforeEach -> test -> @AfterEach = Setup done Test running Teardown done [OK]
Hint: Remember: setup before test, teardown after test [OK]
Common Mistakes:
  • Assuming setup runs after test
  • Ignoring inheritance of setup/teardown
  • Mixing order of print statements
4. Identify the error in this base test class code snippet:
public class BaseTest {
    WebDriver driver;
    @BeforeEach
    void setup() {
        driver = new ChromeDriver();
    }
    @AfterEach
    void teardown() {
        driver.close();
    }
}
medium
A. Using driver.close() instead of driver.quit() in teardown
B. Missing public keyword in class declaration
C. Not initializing WebDriver in setup method
D. Using @BeforeEach instead of @BeforeAll

Solution

  1. Step 1: Understand difference between driver.close() and driver.quit()

    driver.close() closes current window, driver.quit() closes all windows and ends session.
  2. Step 2: Identify best practice for cleanup

    In teardown, driver.quit() is preferred to fully close browser and free resources.
  3. Final Answer:

    Using driver.close() instead of driver.quit() in teardown -> Option A
  4. Quick Check:

    Proper cleanup uses driver.quit() [OK]
Hint: Use driver.quit() to fully close browser in teardown [OK]
Common Mistakes:
  • Confusing driver.close() with driver.quit()
  • Forgetting to quit WebDriver session
  • Assuming driver.close() frees all resources
5. You want to create a base test class that initializes WebDriver only once before all tests run and quits it after all tests finish. Which JUnit 5 annotations should you use in the base class for setup and teardown methods?
hard
A. @BeforeAll for setup and @AfterEach for teardown with static setup only
B. @BeforeEach for setup and @AfterEach for teardown with instance methods
C. @BeforeAll for setup and @AfterAll for teardown with static methods
D. @BeforeEach for setup and @AfterAll for teardown with instance teardown

Solution

  1. Step 1: Understand JUnit 5 lifecycle annotations

    @BeforeAll and @AfterAll run once before and after all tests; methods must be static by default.
  2. Step 2: Match requirement to annotations

    To initialize WebDriver once before all tests and quit after all tests, use @BeforeAll and @AfterAll with static methods.
  3. Final Answer:

    @BeforeAll for setup and @AfterAll for teardown with static methods -> Option C
  4. Quick Check:

    One-time setup/teardown = @BeforeAll/@AfterAll static [OK]
Hint: Use @BeforeAll/@AfterAll static for one-time setup/teardown [OK]
Common Mistakes:
  • Using @BeforeEach/@AfterEach for one-time setup
  • Not making @BeforeAll/@AfterAll methods static
  • Mixing instance and static lifecycle methods
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard