Tdd, ти де?

  • 307 views
Uploaded on

Про інструменти TDD та автоматизацію тестів на Android.

Про інструменти TDD та автоматизацію тестів на Android.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
307
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. TDD, ти де?
  • 2. xor eax, eax mov frametimer, eax mov frameid, 1 mov damage, ~99 cmp frametimer, 7 push 1 Колись програмістам набридло писати двійковий код... $ SET SOURCEFORMAT"FREE" IDENTIFICATION DIVISION. PROGRAM-ID. ShortestProgram. PROCEDURE DIVISION. DisplayPrompt. DISPLAY "I did it". STOP RUN.
  • 3. GNU Make Колись програмістам набридло самим збирати та розгортати свої творіння...
  • 4. Якщо ви робите якусь річ втретє, ви вже мали її автоматизувати А як щодо тестів?
  • 5. Автоматизація тестів Android SDK JUnit 3 protected void setUp() { super.setUp(); emailView = getActivity().findViewById(R.id.login_email); } public void testLogin() { assertNotNull(emailView); } Запускається на пристрої
  • 6. Групи тестів @SmallTest public void testFastAction() { } @MediumTest public void testLongerScenario() { } @LargeTest public void testFullUseCase() { }
  • 7. Не все так просто зробити щось в основному потоці getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { emailView.setText("email"); } });
  • 8. Не все так просто дочекатися всіх операцій в основному потоці getInstrumentation().waitForIdleSync();
  • 9. @FlakyTest(tolerance = 3)
  • 10. Покращення (с) Android Test Kit onView(withId(R.id.my_view)) .perform(click()) .check(matches(isDisplayed()));
  • 11. Додаємо знімки екрана Spoon Spoon.screenshot(activity, "initial_state"); /* Normal test code... */ Spoon.screenshot(activity, "after_login");
  • 12. Spoon
  • 13. Spoon Gradle Plugin buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.9.+' } } apply plugin: 'spoon' $ gradle spoon
  • 14. Fluent assertions dependencies { instrumentTest 'org.easytesting:fest-assert-core:2.0M10' instrumentTest 'com.squareup:fest-android:1.0.+' } assertThat(person.getFriends()).isNotEmpty(); assertThat(emailView).isVisible(); assertThat(emailView).hasText(person.getEmail());
  • 15. Це все не TDD... це лише автоматизація (UI) тестів
  • 16. Для запуску тестів потрібно 1. скомпілювати 2. перетворити в dex 3. упакувати 4. встановити на пристрій час
  • 17. Для запуску тестів потрібно на JVM 1. скомпілювати 2. перетворити в dex 3. упакувати 4. встановити на пристрій Так можна будувати TDD
  • 18. Однак на робочій машині з JVM немає Android Runtime throw new RuntimeException("Stub!");
  • 19. Robolectric @RunWith(RobolectricTestRunner.class) public class DbManagerTest { private DbManager dbManager; @Before public void initDbManager() { dbManager = new DbManager(Robolectric.application); } @Test public void cleanupShouldNotRemoveUsedRecords() { ... } }
  • 20. Robolectric with Gradle buildscript { repositories { mavenCentral() } dependencies { classpath 'com.squareup.gradle:gradle-android-test-plugin:0.9.+' } } apply plugin: 'android-test' dependencies { testCompile 'junit:junit:4.11' testCompile 'org.robolectric:robolectric:2.3-SNAPSHOT' }
  • 21. Robolectric with Gradle dependencies { testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/classes.jar") testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/libs/*.jar") } якщо компілятор скаже, що не може знайти щось із aar
  • 22. Robolectric - це не моки Додамо Mockito RemoteApi api = mock(RemoteApi.class); when(api.get("param")).thenReturn("some value"); // some logic... verify(api).get("param");
  • 23. Таким є наш щоденний арсенал
  • 24. Mattock запуск JUnit 4 тестів на Android-пристроях buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.mattock:gradle-plugin:1.0' } } apply plugin: ‘mattock’ $ gradle androidTest
  • 25. Тепер ніби все Але є ще багато всякого Robotium
  • 26. І ще...
  • 27. Helium нам набридло робити одне й те саме… service { name 'Twitter API' description 'Piece of Twitter API' version 1.1 location "https://api.twitter.com/${version}" get "/users/show.json" spec { name 'Get user profile' parameters { user_id long optional screen_name 'string' optional include_entities boolean optional } response "UserProfile" } }
  • 28. @Дякую Roman Mazur Software engineer at Stanfy mazur.roman@gmail.com +Roman Mazur @roman_mazur