Test Annotations (done, document it):
@Test: Marks a method as a test case.
@BeforeEach and @AfterEach: Run before/after each test method for setup and teardown logic.
@BeforeAll and @AfterAll: Run once before/after all test methods in a class.
@Disabled: Disables a test, so it doesn't run.
Assertions:
Basic assertions: assertEquals(), assertTrue(), assertFalse(), assertNotNull(), etc.
Custom messages: Provide messages for failed assertions.
Exception assertions: Check that a method throws an expected exception using something like assertThrows().
Parameterized Tests:
Allow running the same test with different inputs using parameterized tests.
Test Execution Control:
Test ordering: Run tests in a specific or random order.
Timeouts: Limit the time a test can take before failing.
Test Suites:
Group tests together and run them as a suite.
Mocking and Stubbing:
Allow the creation of mock objects for isolating test cases.
Assertions on Collections:
Support for asserting conditions on collections (e.g., checking size, contents, etc.).
Integration with Build Tools:
Integration with tools like Gradle or Maven for running tests as part of the build process.
Test Result Reporting:
Detailed reports (e.g., console output, XML, or HTML reports) on test success, failure, and skipped tests.
Conditional Test Execution:
Run tests based on specific conditions (e.g., platform, configuration).
Test Discovery:
Automatic discovery of test classes and methods.
Assertions on Threads:
Support for testing multi-threaded code, with options for ensuring certain conditions are met across threads.