Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
TDD, ти де?
xor eax, eax
mov frametimer, eax
mov frameid, 1
mov damage, ~99
cmp frametimer, 7
push 1

Колись
програмістам
набридло
пис...
GNU Make

Колись
програмістам
набридло
самим збирати
та
розгортати
свої творіння...
Якщо ви робите якусь річ втретє, ви вже мали її
автоматизувати

А як щодо тестів?
Автоматизація тестів
Android SDK

JUnit 3

protected void setUp() {
super.setUp();
emailView
= getActivity().findViewById(...
Групи тестів
@SmallTest
public void testFastAction() { }
@MediumTest
public void testLongerScenario() { }
@LargeTest
publi...
Не все так просто
зробити щось в основному потоці
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public voi...
Не все так просто
дочекатися всіх операцій в основному потоці

getInstrumentation().waitForIdleSync();
@FlakyTest(tolerance = 3)
Покращення (с)
Android Test Kit
onView(withId(R.id.my_view))
.perform(click())
.check(matches(isDisplayed()));
Додаємо знімки екрана
Spoon

Spoon.screenshot(activity, "initial_state");
/* Normal test code... */
Spoon.screenshot(activ...
Spoon
Spoon Gradle Plugin
buildscript {
repositories { mavenCentral() }
dependencies {
classpath 'com.stanfy.spoon:spoon-gradle-...
Fluent assertions
dependencies {
instrumentTest 'org.easytesting:fest-assert-core:2.0M10'
instrumentTest 'com.squareup:fes...
Це все не TDD...
це лише автоматизація (UI) тестів
Для запуску тестів потрібно
1. скомпілювати
2. перетворити в dex
3. упакувати
4. встановити на пристрій

час
Для запуску тестів потрібно
на JVM
1. скомпілювати
2. перетворити в dex
3. упакувати
4. встановити на пристрій

Так можна ...
Однак на робочій машині з JVM
немає Android Runtime

throw new RuntimeException("Stub!");
Robolectric
@RunWith(RobolectricTestRunner.class)
public class DbManagerTest {
private DbManager dbManager;
@Before
public...
Robolectric with Gradle
buildscript {
repositories { mavenCentral() }
dependencies {
classpath 'com.squareup.gradle:gradle...
Robolectric with Gradle

dependencies {
testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/classes.jar")
...
Robolectric - це не моки
Додамо Mockito

RemoteApi api = mock(RemoteApi.class);
when(api.get("param")).thenReturn("some va...
Таким є наш щоденний арсенал
Mattock
запуск JUnit 4 тестів на Android-пристроях
buildscript {
repositories { mavenCentral() }
dependencies {
classpath ...
Тепер ніби все

Але є ще багато всякого
Robotium
І ще...
Helium
нам набридло робити одне й те саме…
service {
name 'Twitter API'
description 'Piece of Twitter API'
version 1.1
loc...
@Дякую

Roman Mazur
Software engineer at Stanfy
mazur.roman@gmail.com
+Roman Mazur
@roman_mazur
Upcoming SlideShare
Loading in …5
×

Tdd, ти де?

595 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Tdd, ти де?

  1. 1. TDD, ти де?
  2. 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. 3. GNU Make Колись програмістам набридло самим збирати та розгортати свої творіння...
  4. 4. Якщо ви робите якусь річ втретє, ви вже мали її автоматизувати А як щодо тестів?
  5. 5. Автоматизація тестів Android SDK JUnit 3 protected void setUp() { super.setUp(); emailView = getActivity().findViewById(R.id.login_email); } public void testLogin() { assertNotNull(emailView); } Запускається на пристрої
  6. 6. Групи тестів @SmallTest public void testFastAction() { } @MediumTest public void testLongerScenario() { } @LargeTest public void testFullUseCase() { }
  7. 7. Не все так просто зробити щось в основному потоці getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { emailView.setText("email"); } });
  8. 8. Не все так просто дочекатися всіх операцій в основному потоці getInstrumentation().waitForIdleSync();
  9. 9. @FlakyTest(tolerance = 3)
  10. 10. Покращення (с) Android Test Kit onView(withId(R.id.my_view)) .perform(click()) .check(matches(isDisplayed()));
  11. 11. Додаємо знімки екрана Spoon Spoon.screenshot(activity, "initial_state"); /* Normal test code... */ Spoon.screenshot(activity, "after_login");
  12. 12. Spoon
  13. 13. Spoon Gradle Plugin buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.9.+' } } apply plugin: 'spoon' $ gradle spoon
  14. 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. 15. Це все не TDD... це лише автоматизація (UI) тестів
  16. 16. Для запуску тестів потрібно 1. скомпілювати 2. перетворити в dex 3. упакувати 4. встановити на пристрій час
  17. 17. Для запуску тестів потрібно на JVM 1. скомпілювати 2. перетворити в dex 3. упакувати 4. встановити на пристрій Так можна будувати TDD
  18. 18. Однак на робочій машині з JVM немає Android Runtime throw new RuntimeException("Stub!");
  19. 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. 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. 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. 22. Robolectric - це не моки Додамо Mockito RemoteApi api = mock(RemoteApi.class); when(api.get("param")).thenReturn("some value"); // some logic... verify(api).get("param");
  23. 23. Таким є наш щоденний арсенал
  24. 24. Mattock запуск JUnit 4 тестів на Android-пристроях buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.mattock:gradle-plugin:1.0' } } apply plugin: ‘mattock’ $ gradle androidTest
  25. 25. Тепер ніби все Але є ще багато всякого Robotium
  26. 26. І ще...
  27. 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. 28. @Дякую Roman Mazur Software engineer at Stanfy mazur.roman@gmail.com +Roman Mazur @roman_mazur

×