Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TDD, ти де?
Search
Roman Mazur
October 27, 2013
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TDD, ти де?
Інструменти для автоматизації тестів та TDD на Android. GDG DevFest 2013.
Roman Mazur
October 27, 2013
More Decks by Roman Mazur
See All by Roman Mazur
Power of Android Shell
romanmazur
0
99
Android Loader and Enroscar Async
romanmazur
1
160
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
JIS keyboard support in Omarchy
lef237
0
120
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
230
Jetpack Compose Mechanisms
skydoves
3
820
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
AWSに止められる覚悟してますか?
morizo_1984
2
540
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
What's in a price? How to price your products and services
michaelherold
247
13k
Un-Boring Meetings
codingconduct
0
460
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
YesSQL, Process and Tooling at Scale
rocio
174
15k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
820
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Transcript
TDD, ти де?
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. Колись програмістам набридло писати двійковий код...
Колись програмістам набридло самим збирати та розгортати свої творіння... GNU
Make
Якщо ви робите якусь річ втретє, ви вже мали її
автоматизувати А як щодо тестів?
Автоматизація тестів Android SDK JUnit 3 protected void setUp() {
super.setUp(); emailView = getActivity().findViewById(R.id.login_email); } public void testLogin() { assertNotNull(emailView); } Запускається на пристрої
Групи тестів @SmallTest public void testFastAction() { } @MediumTest public
void testLongerScenario() { } @LargeTest public void testFullUseCase() { }
Не все так просто зробити щось в основному потоці getInstrumentation().runOnMainSync(new
Runnable() { @Override public void run() { emailView.setText("email"); } });
Не все так просто дочекатися всіх операцій в основному потоці
getInstrumentation().waitForIdleSync();
@FlakyTest(tolerance = 3)
Android Test Kit onView(withId(R.id.my_view)) .perform(click()) .check(matches(isDisplayed())); Покращення (с)
Spoon.screenshot(activity, "initial_state"); /* Normal test code... */ Spoon.screenshot(activity, "after_login"); Додаємо
знімки екрана Spoon
Spoon
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.9.+'
} } apply plugin: 'spoon' Spoon Gradle Plugin $ gradle spoon
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());
Це все не TDD... це лише автоматизація (UI) тестів
Для запуску тестів потрібно 1. скомпілювати 2. перетворити в dex
3. упакувати 4. встановити на пристрій час
Для запуску тестів потрібно 1. скомпілювати 2. перетворити в dex
3. упакувати 4. встановити на пристрій на JVM Так можна будувати TDD
Однак на робочій машині з JVM немає Android Runtime throw
new RuntimeException("Stub!");
Robolectric @RunWith(RobolectricTestRunner.class) public class DbManagerTest { private DbManager dbManager; @Before
public void initDbManager() { dbManager = new DbManager(Robolectric.application); } @Test public void cleanupShouldNotRemoveUsedRecords() { ... } }
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' }
Robolectric with Gradle dependencies { testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/classes.jar")
testCompile fileTree(dir: "$buildDir/exploded-bundles", include: "*/libs/*.jar") } якщо компілятор скаже, що не може знайти щось із aar
RemoteApi api = mock(RemoteApi.class); when(api.get("param")).thenReturn("some value"); // some logic... verify(api).get("param");
Robolectric - це не моки Додамо Mockito
Таким є наш щоденний арсенал
Mattock buildscript { repositories { mavenCentral() } dependencies { classpath
'com.stanfy.mattock:gradle-plugin:1.0' } } apply plugin: ‘mattock’ $ gradle androidTest запуск JUnit 4 тестів на Android-пристроях
Тепер ніби все Але є ще багато всякого Robotium
І ще...
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" } }
@Дякую Roman Mazur Software engineer at Stanfy
[email protected]
+Roman Mazur
@roman_mazur