Testing in the software development lifecycle in Testing Fundamentals - Build an Automation Script
import unittest class TestSDLCPhases(unittest.TestCase): def setUp(self): # Setup test environment, e.g., load requirements and test cases self.requirements = ['Login', 'Search', 'Checkout'] self.test_cases = { 'Login': ['test_login_valid', 'test_login_invalid'], 'Search': ['test_search_results'], 'Checkout': ['test_checkout_process'] } self.unit_tests_passed = True self.integration_tests_passed = True self.system_tests_passed = True self.defects_logged = [] self.acceptance_tests_passed = True def test_test_cases_exist_for_requirements(self): for req in self.requirements: self.assertIn(req, self.test_cases, f"No test cases for requirement: {req}") self.assertGreater(len(self.test_cases[req]), 0, f"No test cases listed for {req}") def test_unit_tests_pass(self): self.assertTrue(self.unit_tests_passed, "Unit tests did not pass") def test_integration_and_system_tests_pass(self): self.assertTrue(self.integration_tests_passed, "Integration tests did not pass") self.assertTrue(self.system_tests_passed, "System tests did not pass") def test_defects_logged_on_failures(self): # Simulate a failure and defect logging if not self.unit_tests_passed: self.defects_logged.append('Unit test failure defect') self.assertTrue(len(self.defects_logged) >= 0, "Defects should be logged when tests fail") def test_acceptance_tests_pass_before_deployment(self): self.assertTrue(self.acceptance_tests_passed, "Acceptance tests did not pass before deployment") def tearDown(self): # Clean up test environment pass if __name__ == '__main__': unittest.main()
This test class simulates verifying testing activities in the software development lifecycle.
setUp() prepares the test environment with sample requirements and test cases, and flags for test results.
test_test_cases_exist_for_requirements() checks that each requirement has at least one test case.
test_unit_tests_pass() asserts that unit tests passed during implementation.
test_integration_and_system_tests_pass() asserts integration and system tests passed after implementation.
test_defects_logged_on_failures() simulates defect logging if tests fail and asserts defects are logged.
test_acceptance_tests_pass_before_deployment() asserts acceptance tests passed before deployment.
Each test uses clear assertions to verify expected outcomes, following best practices for test organization and clarity.
Now add data-driven testing with 3 different sets of requirements and test cases
Practice
Solution
Step 1: Understand the role of Requirement Analysis
This phase gathers and analyzes what the software should do, including defining test requirements.Step 2: Identify testing planning activities
Planning how to test is done early, during Requirement Analysis, to ensure tests cover all needs.Final Answer:
Requirement Analysis -> Option CQuick Check:
Testing plan starts in Requirement Analysis [OK]
- Confusing coding phase with testing planning
- Thinking deployment includes test planning
- Assuming maintenance is for initial test planning
Solution
Step 1: Identify standard test case format
Standard test cases include clear ID, description, and expected result fields.Step 2: Compare options to standard format
Test Case ID: TC001\nDescription: Verify login functionality\nExpected Result: User logs in successfully matches the clear, structured format; others are incomplete or unclear.Final Answer:
Test Case ID: TC001\nDescription: Verify login functionality\nExpected Result: User logs in successfully -> Option AQuick Check:
Clear ID, description, expected result = Test Case ID: TC001\nDescription: Verify login functionality\nExpected Result: User logs in successfully [OK]
- Using unclear or incomplete test case fields
- Mixing field names or order
- Omitting expected results
def test_addition():
result = 2 + 3
assert result == 5
print('Test passed')What will be the output when this test runs?
Solution
Step 1: Analyze the test function logic
The function adds 2 + 3, stores 5 in result, then asserts result equals 5, which is true.Step 2: Determine output after assertion
Since assertion passes, the print statement runs, outputting 'Test passed'.Final Answer:
Test passed -> Option BQuick Check:
Assertion true means print runs [OK]
- Thinking assertion always raises error
- Expecting no output from print
- Confusing syntax with runtime error
def test_divide():
result = 10 / 0
assert result == 0What is the main problem with this test?
Solution
Step 1: Identify the operation causing error
Dividing 10 by 0 causes a ZeroDivisionError at runtime.Step 2: Understand impact on test execution
Because of the error, assertion is never reached and test fails with exception.Final Answer:
Division by zero causes runtime error -> Option DQuick Check:
Division by zero = runtime error [OK]
- Ignoring runtime error and focusing on assertion
- Thinking assertion is wrong instead
- Assuming print statement needed
Solution
Step 1: Understand testing types and their purpose
Unit Testing checks small code parts; Acceptance Testing checks user needs; Smoke Testing checks basic functionality.Step 2: Identify testing for post-deployment changes
Regression Testing reruns tests to ensure new changes don't break existing features after deployment.Final Answer:
Regression Testing -> Option AQuick Check:
Regression Testing catches post-change issues [OK]
- Confusing unit testing with regression testing
- Thinking acceptance testing covers code changes
- Assuming smoke testing is for detailed checks
Ready to prove it?
Pass the test and this pattern moves unknown
