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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
phperだってパンチカードでコーディングしたい
o0h
PRO
0
340
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
1.5k
Domain-Driven Transformation
hschwentner
2
2.3k
ジョジョの世界をXRで再現する
mofurune
0
170
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
2
350
AWSに止められる覚悟してますか?
morizo_1984
2
540
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
150
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Featured
See All Featured
Believing is Seeing
oripsolob
1
240
Game over? The fight for quality and originality in the time of robots
wayneb77
1
310
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
Optimising Largest Contentful Paint
csswizardry
37
4k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
600
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
The Invisible Side of Design
smashingmag
301
52k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Bash Introduction
62gerente
615
220k
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