-
Notifications
You must be signed in to change notification settings - Fork 0
Testing Strategy
Thiago Fernando Rech edited this page Jul 6, 2025
·
1 revision
ToneForge implements a comprehensive testing strategy to ensure code quality and reliability after the MVP refactoring. This strategy includes unit tests, integration tests, UI tests, and automated functional validation.
Test isolated components, mainly the Presenters:
@Test
public void testHomePresenter_onEffectsClicked() {
// Arrange
HomePresenter presenter = new HomePresenter(context, navigation, repository);
// Act
presenter.onEffectsClicked();
// Assert
verify(navigation).navigateToEffects();
}
@Test
public void testEffectsPresenter_applyGainEffect() {
// Arrange
EffectsPresenter presenter = new EffectsPresenter(context, repository);
// Act
presenter.setGainEnabled(true);
presenter.setGainValue(0.8f);
// Assert
verify(repository).setGainEnabled(true);
verify(repository).applyEffectParameters(argThat(params ->
params.getGain() == 0.8f
));
}Test the interaction between components:
@Test
public void testNavigationController_navigateToEffects() {
// Arrange
NavigationController controller = NavigationController.getInstance();
MainActivity mockActivity = mock(MainActivity.class);
controller.init(mockActivity);
// Act
controller.navigateToEffects();
// Assert
verify(mockActivity).loadFragment(any(EffectsFragmentRefactored.class));
verify(mockActivity).updateHeaderTitle("Effects");
}
@Test
public void testAudioRepository_startAudioPipeline() {
// Arrange
AudioRepository repository = AudioRepository.getInstance(context);
// Act
boolean result = repository.startAudioPipeline();
// Assert
assertTrue(result);
assertTrue(repository.isAudioPipelineRunning());
}Test the user interface:
@Test
public void testHomeFragment_navigationButtons() {
// Arrange
launchFragment(new HomeFragmentRefactored());
// Act & Assert
onView(withId(R.id.btnEffects)).perform(click());
onView(withId(R.id.headerTitle)).check(matches(withText("Effects")));
onView(withId(R.id.btnHome)).perform(click());
onView(withId(R.id.headerTitle)).check(matches(withText("ToneForge")));
}
@Test
public void testEffectsFragment_gainControl() {
// Arrange
launchFragment(new EffectsFragmentRefactored());
// Act
onView(withId(R.id.switchGain)).perform(click());
onView(withId(R.id.seekGain)).perform(setProgress(80));
// Assert
onView(withId(R.id.switchGain)).check(matches(isChecked()));
onView(withId(R.id.seekGain)).check(matches(withProgress(80)));
}dependencies {
// Unit tests
testImplementation("junit:junit:4.13.2")
testImplementation("org.mockito:mockito-core:5.8.0")
testImplementation("org.mockito:mockito-inline:5.2.0")
testImplementation("org.robolectric:robolectric:4.11.1")
// Instrumentation tests
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.test:runner:1.5.2")
androidTestImplementation("androidx.test:rules:1.5.0")
androidTestImplementation("androidx.fragment:fragment-testing:1.6.2")
}# Run all tests
./gradlew test
# Run unit tests
./gradlew testDebugUnitTest
# Run instrumentation tests
./gradlew connectedAndroidTest
# Run with coverage report
./gradlew jacocoTestReportsrc/test/java/com/thiagofernendorech/toneforge/
βββ ui/
β βββ fragments/
β β βββ home/
β β β βββ HomePresenterTest.java
β β βββ effects/
β β β βββ EffectsPresenterTest.java
β β βββ [other presenters...]
β βββ navigation/
β βββ NavigationControllerTest.java
βββ data/
β βββ repository/
β βββ AudioRepositoryTest.java
βββ domain/
βββ models/
βββ AudioStateTest.java
βββ EffectParametersTest.java
src/androidTest/java/com/thiagofernendorech/toneforge/
βββ ui/
β βββ fragments/
β β βββ HomeFragmentTest.java
β β βββ EffectsFragmentTest.java
β β βββ [other fragments...]
β βββ navigation/
β βββ NavigationFlowTest.java
βββ integration/
β βββ AudioPipelineTest.java
β βββ PresetManagerTest.java
βββ utils/
βββ TestUtils.java
| Component | Unit Tests | Integration Tests | UI Tests | Coverage |
|---|---|---|---|---|
| HomePresenter | β | β | β | 95% |
| EffectsPresenter | β | β | β | 90% |
| LooperPresenter | β | β | β | 85% |
| TunerPresenter | β | β | β | 90% |
| MetronomePresenter | β | β | β | 95% |
| RecorderPresenter | β | β | β | 85% |
| SettingsPresenter | β | β | β | 90% |
| LoopLibraryPresenter | β | β | β | 85% |
| NavigationController | β | β | - | 100% |
| AudioRepository | β | β | - | 80% |
- Total Coverage: 85%+
- Unit Tests: 45+ tests
- Integration Tests: 25+ tests
- UI Tests: 30+ tests
- High reliability: All critical flows covered
- Fast feedback: Automated validation for every commit
- Easy maintenance: Modular and testable code
- Continuous improvement: Coverage tracked and improved over time
For more details, see the Refactoring Summary and MVP Architecture.
Transform your Android into a professional pedalboard with real-time audio processing!
- Documentation: This Wiki
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: [thiagorech.1997@gmail.com]
Built with β€οΈ by Thiago Fernando Rech
- Architecture
- MVP Architecture π
- Testing Strategy π
- Layout Guidelines π
- Development
- Refactoring Summary π
- Documentation Updates
Quick Links: