Understanding Different Testing Types and Tools
In today’s rapidly evolving software world, ensuring code quality and application reliability is paramount. Comprehensive testing plays a critical role in achieving these goals. This article breaks down different types of testing, testing styles, libraries, tools, methods, principles, and some essential terminologies.
1. Testing Types
a. Functional Tests
Unit Test (Coverage): Focused on individual components. It’s about covering as much code as possible with tests.
Fuzzing Test: Involves throwing random inputs at software to find vulnerabilities.
Property Test: Validates properties that a software component should hold.
Table Test (parameterized test): Test a function against multiple scenarios.
b. Integration Test
Checks the interactions between components. Works with IO Mocks, Stubs, and Fakes to test the happy path.
c. Smoke Tests (Interface Tests)
These tests work with Docker and third-party integrations. They are done to check the built artifact before pushing it to the repository.
d. Consumer Driven Contract Tests (Pact)
Ensures different services in a system interact correctly.
e. End to End Tests (System Tests)
Standalone tests that simulate against a real environment.
f. User Journey Tests (Acceptance Test)
Focuses on the user’s experience. Works on real environments.
g. Non-Functional Tests
Documentation Tests: Validate documentation accuracy.
Security Tests, Vulnerability Checks: Ensure software security.
Dependency & License Tests: Check software dependencies and licenses.
Performance Tests: Includes Load Testing, Stress Testing, and Benchmark Tests.
2. Unit Testing Libraries
a. Test Libraries
Examples include JUnit and Hamcrest.
b. Matchers
Enable precise test validations.
c. Test Doubles
Include Stubs, Spies, Mocks, and Fakers. These help simulate various conditions and behaviors during testing.
d. Code Analysis Tools
Tools like Static Analysis, Race Condition Detector, and Code Coverage provide insights into code quality.
3. Test Tools
For different programming languages, various tools help facilitate and streamline the testing process:
Java: JUnit, Mockito, Awaitility, WireMock, JMeter, ArchUnit, and more.
Golang: Testify, Ginkgo / Gomega.
Node: Cypress, Taiko, Chai, React Testing Library.
4. Method & Principles
TDD (Test-Driven Development): Begin with writing tests before the actual code.
ATDD (Acceptance Test Driven Development): Focus on user acceptance tests.
BDD (Behavior Driven Development): Uses human-understandable scenarios.
F.I.R.S.T Principles:
- Fast: Quick test execution.
- Independent: Tests don’t depend on each other.
- Repeatable: Consistent test results.
- Self-checking: Automated pass/fail checking.
- Timely: Written alongside or before the code.
5. Understanding Test Doubles
Stub: Provides predefined answers to method calls.
Mock: An object on which you set expectations.
Fake: An object with limited capabilities, like a fake web service.
Spy: Tracks calls and state.
In general, these can be termed as “Test Doubles.” But often, you’ll find people informally referring to all of them as mocks.
6. Dictionary
- SUT: Stands for “System Under Test” or “Subject Under Test.”