After completing this course, learners will have an understanding of a variety of black-box and white-box testing techniques. The learner will have put this understanding into practice, creating effective sets of test cases (called a test suite) to properly exercise software for defect finding. The learner will have examined requirements for testability, created an oracle for automated testing, assessed fault-finding effectiveness of test suites, and generated inputs using a variety of techniques. After completing this course, you will be able to: - evaluate testability of requirements - define testable units within a program specification - apply black-box test input selection methods - specifically boundary-value analysis, fuzzing, and random selection - and select the method most-suited to achieve the given testing objective - assess the fault-finding effectiveness of a functional test suite using mutation testing - use category partitioning to develop automated functional tests (with Cucumber) based on a given software specification - create an expected-value oracle from a program description to use within the generated tests In order to do well in this course, you should have experience with an OOP language (like Java), have an IDE installed (e.g., Eclipse), and be familiar with testing terminology (see Intro to Software Testing course within this specialization). we also expect a familiarity with the Software Development Lifecycle and the context in which the testing stage sits. This course is primarily aimed at those learners interested in any of the following roles: Software Engineer, Software Engineer in Test, Test Automation Engineer, DevOps Engineer, Software Developer, Programmer, Computer Enthusiast.