Bird
Raised Fist0
Testing Fundamentalstesting~8 mins

Unit testing in Testing Fundamentals - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Unit testing
Folder Structure for Unit Testing Framework
project-root/
├── src/
│   └── main_code/          # Your application source code
│       └── ...
├── tests/                  # Unit test files
│   ├── test_module1.py
│   ├── test_module2.py
│   └── ...
├── fixtures/               # Test data and setup helpers
│   └── ...
├── utils/                  # Utility functions for tests
│   └── ...
├── requirements.txt        # Dependencies
├── pytest.ini              # Test runner configuration
└── README.md
  
Test Framework Layers for Unit Testing
  • Test Cases Layer: Individual unit tests that check small pieces of code (functions, methods).
  • Test Utilities Layer: Helper functions to set up test data or common operations.
  • Fixtures Layer: Setup and teardown code to prepare environment or data before tests run.
  • Source Code Layer: The actual application code being tested.
  • Configuration Layer: Settings for test runner, environment variables, and dependencies.
Configuration Patterns for Unit Testing
  • Test Runner Config: Use pytest.ini or similar to define test discovery rules and options.
  • Environment Variables: Use environment variables or config files to switch between test and production settings.
  • Mocking External Calls: Replace external dependencies with mocks to isolate unit tests.
  • Test Data Management: Use fixtures or factory functions to create consistent test data.
Test Reporting and CI/CD Integration
  • Use test runners like pytest that provide clear pass/fail output and error details.
  • Generate reports in formats like JUnit XML for integration with CI tools (GitHub Actions, Jenkins).
  • Configure CI pipelines to run unit tests automatically on code push or pull requests.
  • Fail the build if any unit test fails to ensure code quality.
Best Practices for Unit Testing Frameworks
  • Isolate Tests: Each test should check one small piece of code without relying on others.
  • Use Clear Naming: Name test files and functions to describe what they test.
  • Keep Tests Fast: Unit tests should run quickly to encourage frequent runs.
  • Use Fixtures for Setup: Avoid repeating setup code by using fixtures or setup functions.
  • Mock External Dependencies: Replace calls to databases, APIs, or files with mocks to keep tests focused.
Self Check Question

Where in this folder structure would you add a new unit test for a function that calculates discounts?

Key Result
Unit testing frameworks organize small, fast, isolated tests with clear structure and configuration for reliable code validation.

Practice

(1/5)
1. What is the main purpose of unit testing in software development?
easy
A. To deploy the software to users
B. To test the entire software system at once
C. To check small parts of code work correctly
D. To design the user interface

Solution

  1. Step 1: Understand unit testing scope

    Unit testing focuses on testing small, individual parts of code, like functions or methods.
  2. Step 2: Compare with other testing types

    Testing the entire system is integration or system testing, not unit testing.
  3. Final Answer:

    To check small parts of code work correctly -> Option C
  4. Quick Check:

    Unit testing = small code parts check [OK]
Hint: Unit tests check small code parts, not whole system [OK]
Common Mistakes:
  • Confusing unit testing with system testing
  • Thinking unit tests check UI or deployment
  • Believing unit tests run the full application
2. Which of the following is the correct syntax for a simple unit test assertion in Python using assert?
easy
A. assert add(2, 3) == 5
B. assert add(2, 3) = 5
C. assert(add(2, 3) = 5)
D. assert add(2, 3) equals 5

Solution

  1. Step 1: Recall Python assert syntax

    Python uses assert expression where expression must be True for test to pass.
  2. Step 2: Check each option

    assert add(2, 3) == 5 uses correct syntax: assert add(2, 3) == 5. assert add(2, 3) = 5 uses single = which is assignment, invalid here. assert(add(2, 3) = 5) uses single = which is assignment, invalid syntax. assert add(2, 3) equals 5 uses invalid keyword 'equals'.
  3. Final Answer:

    assert add(2, 3) == 5 -> Option A
  4. Quick Check:

    assert with == for comparison [OK]
Hint: Use 'assert expression' with '==' for comparison in Python [OK]
Common Mistakes:
  • Using single '=' instead of '==' in assert
  • Writing assert with invalid keywords
  • Adding unnecessary parentheses in assert
3. Given the Python function and test below, what will be the test result?
def multiply(a, b):
    return a * b

assert multiply(3, 4) == 12
assert multiply(0, 5) == 0
assert multiply(-1, 3) == -3
assert multiply(2, 2) == 5
medium
A. The last assertion fails
B. All assertions pass
C. The first assertion fails
D. The second assertion fails

Solution

  1. Step 1: Evaluate each assertion

    multiply(3,4) = 12 matches expected 12 (pass). multiply(0,5) = 0 matches 0 (pass). multiply(-1,3) = -3 matches -3 (pass). multiply(2,2) = 4 but expected 5 (fail).
  2. Step 2: Identify failing assertion

    The last assertion expects 5 but function returns 4, so it fails.
  3. Final Answer:

    The last assertion fails -> Option A
  4. Quick Check:

    4 != 5 causes failure [OK]
Hint: Check each assert expected vs actual carefully [OK]
Common Mistakes:
  • Assuming all assertions pass without checking values
  • Confusing multiplication results
  • Ignoring the last assertion
4. Identify the error in the following Python unit test code:
def divide(a, b):
    return a / b

assert divide(10, 2) == 5
assert divide(5, 0) == 0
medium
A. The function should return integer only
B. Division by zero causes runtime error
C. The first assertion is incorrect
D. Assertions are missing parentheses

Solution

  1. Step 1: Analyze function behavior

    Function divides a by b. Dividing by zero is not allowed and causes an error.
  2. Step 2: Check assertions

    First assertion divides 10 by 2, which is valid. Second assertion divides 5 by 0, which causes a runtime ZeroDivisionError.
  3. Final Answer:

    Division by zero causes runtime error -> Option B
  4. Quick Check:

    Divide by zero error in second assert [OK]
Hint: Watch for zero division in tests [OK]
Common Mistakes:
  • Ignoring division by zero error
  • Thinking assertions need parentheses in Python
  • Assuming function returns only integers
5. You want to write a unit test for a function that returns the maximum number from a list. Which test case below best checks the function handles an empty list correctly?
hard
A. assert max_number([-1, -2]) == -1
B. assert max_number([1, 2, 3]) == 3
C. assert max_number([0]) == 0
D. assert max_number([]) == None

Solution

  1. Step 1: Understand the edge case

    An empty list has no maximum value, so the function should handle this gracefully, often by returning None or raising an error.
  2. Step 2: Evaluate test cases

    assert max_number([]) == None tests the empty list case expecting None, which is appropriate. Other options test normal lists, not empty.
  3. Final Answer:

    assert max_number([]) == None -> Option D
  4. Quick Check:

    Empty list test expects None [OK]
Hint: Test empty inputs with None or error expected [OK]
Common Mistakes:
  • Not testing empty list edge case
  • Using normal list tests for empty case
  • Assuming empty list returns zero
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