Types of Testing: Functional and Non-Functional
Software testing is not a single activity but a spectrum of strategies, each designed to expose different classes of defects. Without a clear understanding of testing categories, you risk either over-testing—wasting time on irrelevant checks—or under-testing, shipping software that fails under real-world conditions. This course equips you with the conceptual framework to distinguish between functional testing, which verifies what the system does, and non-functional testing, which evaluates how the system performs. By mastering these distinctions, you will be able to align testing efforts with business risks, regulatory requirements, and user expectations—a skill that directly impacts product quality and release confidence. The programme covers the full taxonomy of testing types. For functional testing, you will explore equivalence partitioning, boundary value analysis, decision tables, and state-transition testing—techniques used to derive test cases from specifications. You will also examine use-case testing and exploratory testing, which rely on user scenarios and tester intuition. For non-functional testing, the course delves into performance testing (load, stress, endurance, spike), security testing (vulnerability scanning, penetration testing, authentication/authorization checks), usability testing (heuristic evaluation, user observation), and reliability testing (mean time between failures, fault tolerance). Each technique is presented with concrete examples, typical defects it uncovers, and when to apply it in the development lifecycle. The course also addresses the interplay between functional and non-functional requirements—for instance, how a functional feature can degrade performance if not designed for scalability. Methodologically, the course emphasizes practical classification over theory. You will work through real-world case studies where you must decide which testing types are appropriate given a set of requirements, constraints, and quality goals. Common pitfalls are highlighted: conflating functional correctness with performance, ignoring security in early functional tests, or applying load testing without baseline metrics. You will learn to write test objectives that clearly specify the type, scope, and success criteria of each test activity, avoiding vague or overlapping goals. The course also covers how to organize testing activities into a coherent plan that respects resource constraints and delivery timelines. This course is designed for junior software testers who need to move beyond manual test execution; quality assurance engineers transitioning into test design roles; developers who write unit or integration tests and want to understand system-level testing; and technical project managers who oversee testing deliverables and need to evaluate test coverage and risk. It is also suitable for recent computer science graduates entering the software industry who want a structured foundation in testing principles. By the end of the course, you will have a clear vocabulary to differentiate functional from non-functional tests, a set of techniques to apply for each category, and the ability to read test objectives and plans with critical understanding. You will be able to identify which testing types are suitable for given requirements and justify your choices based on risk, cost, and quality attributes. You will also gain practical knowledge of common testing tools and how they support each type, though the course focuses on concepts rather than tool-specific training.
Course content
- 3 lessons
Introduction to Software Testing
- 4 lessons
Functional Testing
- 4 lessons
Non-Functional Testing
- 4 lessons
Comparing Testing Types and Applying Them
- 2 lessons
Course Review and Assessment