Top Banner
TDD, ти де?
28

Tdd, ти де?

May 06, 2015

Download

Technology

Roman Mazur

Про інструменти TDD та автоматизацію тестів на Android.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tdd, ти де?

TDD, ти де?

Page 2: Tdd, ти де?

xor eax, eaxmov frametimer, eaxmov frameid, 1mov damage, ~99cmp frametimer, 7push 1

$ SET SOURCEFORMAT"FREE"IDENTIFICATION DIVISION.PROGRAM-ID. ShortestProgram.

PROCEDURE DIVISION.DisplayPrompt. DISPLAY "I did it". STOP RUN.

Колись програмістам набридло писати двійковий код...

Page 3: Tdd, ти де?

Колись програмістам набридло самим збирати та розгортати свої творіння...

GNU Make

Page 4: Tdd, ти де?

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

А як щодо тестів?

Page 5: Tdd, ти де?

Автоматизація тестів

Android SDK JUnit 3

protected void setUp() { super.setUp(); emailView = getActivity().findViewById(R.id.login_email);}

public void testLogin() { assertNotNull(emailView);}

Запускається на пристрої

Page 6: Tdd, ти де?

Групи тестів

@SmallTestpublic void testFastAction() { }

@MediumTestpublic void testLongerScenario() { }

@LargeTestpublic void testFullUseCase() { }

Page 7: Tdd, ти де?

Не все так просто

зробити щось в основному потоці

getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { emailView.setText("email"); }});

Page 8: Tdd, ти де?

Не все так просто

дочекатися всіх операцій в основному потоці

getInstrumentation().waitForIdleSync();

Page 9: Tdd, ти де?

@FlakyTest(tolerance = 3)

Page 10: Tdd, ти де?

Android Test Kit

onView(withId(R.id.my_view)) .perform(click()) .check(matches(isDisplayed()));

Покращення (с)

Page 11: Tdd, ти де?

Spoon.screenshot(activity, "initial_state");/* Normal test code... */Spoon.screenshot(activity, "after_login");

Додаємо знімки екрана

Spoon

Page 12: Tdd, ти де?

Spoon

Page 13: Tdd, ти де?

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.9.+' }}apply plugin: 'spoon'

Spoon Gradle Plugin

$ gradle spoon

Page 14: Tdd, ти де?

dependencies { instrumentTest 'org.easytesting:fest-assert-core:2.0M10' instrumentTest 'com.squareup:fest-android:1.0.+'}

Fluent assertions

assertThat(person.getFriends()).isNotEmpty();assertThat(emailView).isVisible();assertThat(emailView).hasText(person.getEmail());

Page 15: Tdd, ти де?

Це все не TDD...

це лише автоматизація (UI) тестів

Page 16: Tdd, ти де?

Для запуску тестів потрібно

1. скомпілювати

2. перетворити в dex

3. упакувати

4. встановити на пристрій час

Page 17: Tdd, ти де?

Для запуску тестів потрібно

1. скомпілювати

2. перетворити в dex

3. упакувати

4. встановити на пристрій

на JVM

Так можна будувати TDD

Page 18: Tdd, ти де?

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

throw new RuntimeException("Stub!");

Page 19: Tdd, ти де?

Robolectric@RunWith(RobolectricTestRunner.class)public class DbManagerTest {

private DbManager dbManager;

@Before public void initDbManager() { dbManager = new DbManager(Robolectric.application); }

@Test public void cleanupShouldNotRemoveUsedRecords() { ... }

}

Page 20: Tdd, ти де?

Robolectric with Gradlebuildscript { 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'}

Page 21: Tdd, ти де?

Robolectric with Gradle

dependencies { testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/classes.jar") testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/libs/*.jar")}

якщо компілятор скаже, що не може знайти щось із aar

Page 22: Tdd, ти де?

RemoteApi api = mock(RemoteApi.class);when(api.get("param")).thenReturn("some value");// some logic...verify(api).get("param");

Robolectric - це не моки

Додамо Mockito

Page 23: Tdd, ти де?

Таким є наш щоденний арсенал

Page 24: Tdd, ти де?

Mattock

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.mattock:gradle-plugin:1.0' }}apply plugin: ‘mattock’

$ gradle androidTest

запуск JUnit 4 тестів на Android-пристроях

Page 25: Tdd, ти де?

Тепер ніби все

Але є ще багато всякого

Robotium

Page 26: Tdd, ти де?

І ще...

Page 27: Tdd, ти де?

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" }}

Page 28: Tdd, ти де?

@Дякую

Roman Mazur

Software engineer at Stanfy

[email protected]+Roman Mazur@roman_mazur