0
0
PyTesttesting~15 mins

Single responsibility per test in PyTest - Build an Automation Script

Choose your learning style9 modes available
Verify login page functionalities with single responsibility tests
Preconditions (2)
Step 1: Open the login page
Step 2: Verify the page title is 'Login Page'
Step 3: Enter a valid username 'user1' in the username field
Step 4: Enter a valid password 'Password123' in the password field
Step 5: Click the login button
Step 6: Verify the user is redirected to the dashboard page
Step 7: Open the login page again
Step 8: Verify the username field is empty
Step 9: Verify the password field is empty
Step 10: Verify the login button is disabled when fields are empty
✅ Expected Result: Each test verifies only one functionality: page title, successful login, empty fields on load, and login button disabled state. All tests pass independently.
Automation Requirements - pytest
Assertions Needed:
Page title equals 'Login Page'
After login, URL contains '/dashboard'
Username and password fields are empty on page load
Login button is disabled when username or password is empty
Best Practices:
Write one assertion per test to keep single responsibility
Use pytest fixtures for setup like opening the login page
Use clear and descriptive test function names
Avoid combining multiple checks in one test
Use explicit waits if needed for page load
Automated Solution
PyTest
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

@pytest.fixture
sdef driver():
    driver = webdriver.Chrome()
    driver.get('https://example.com/login')
    yield driver
    driver.quit()

@pytest.fixture
def wait(driver):
    return WebDriverWait(driver, 10)


def test_login_page_title(driver):
    assert driver.title == 'Login Page'


def test_successful_login_redirect(driver, wait):
    username_input = driver.find_element(By.ID, 'username')
    password_input = driver.find_element(By.ID, 'password')
    login_button = driver.find_element(By.ID, 'login-btn')

    username_input.send_keys('user1')
    password_input.send_keys('Password123')
    login_button.click()

    wait.until(EC.url_contains('/dashboard'))
    assert '/dashboard' in driver.current_url


@pytest.fixture
def open_login_page(driver):
    driver.get('https://example.com/login')


def test_username_field_empty_on_load(driver, open_login_page):
    username_input = driver.find_element(By.ID, 'username')
    assert username_input.get_attribute('value') == ''


def test_password_field_empty_on_load(driver, open_login_page):
    password_input = driver.find_element(By.ID, 'password')
    assert password_input.get_attribute('value') == ''


def test_login_button_disabled_when_fields_empty(driver, open_login_page):
    login_button = driver.find_element(By.ID, 'login-btn')
    assert not login_button.is_enabled()

This test suite uses pytest with Selenium WebDriver to automate the login page tests.

We use fixtures to open the browser and navigate to the login page before each test.

Each test checks only one thing: the page title, successful login redirect, empty username field, empty password field, and login button disabled state.

This keeps tests simple and focused, making failures easier to understand and fix.

Explicit waits ensure the page redirects before asserting the URL.

Common Mistakes - 3 Pitfalls
Combining multiple assertions in one test
Not resetting the page state between tests
Using implicit waits or no waits causing timing issues
Bonus Challenge

Now add data-driven testing with 3 different sets of valid usernames and passwords for the login test

Show Hint