Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TDD, ти де?
Search
Roman Mazur
October 27, 2013
Programming
0
120
TDD, ти де?
Інструменти для автоматизації тестів та TDD на Android. GDG DevFest 2013.
Roman Mazur
October 27, 2013
Tweet
Share
More Decks by Roman Mazur
See All by Roman Mazur
Power of Android Shell
romanmazur
0
94
Android Loader and Enroscar Async
romanmazur
1
160
Other Decks in Programming
See All in Programming
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
1.4k
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
160
Rethinking API Platform Filters
vinceamstoutz
0
2.9k
飯MCP
yusukebe
0
410
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
160
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
170
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
150
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
190
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
190
Xdebug と IDE による デバッグ実行の仕組みを見る / Exploring-How-Debugging-Works-with-Xdebug-and-an-IDE
shin1x1
0
260
AI Assistants for YourAngular Solutions @Angular Graz, March 2026
manfredsteyer
PRO
0
120
Nuxt Server Components
wattanx
0
160
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
280
Designing for Performance
lara
611
70k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Become a Pro
speakerdeck
PRO
31
5.9k
Amusing Abliteration
ianozsvald
0
140
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.3k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
700
It's Worth the Effort
3n
188
29k
For a Future-Friendly Web
brad_frost
183
10k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
490
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