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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
CSC307 Lecture 07
javiergs
PRO
1
560
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
AI & Enginnering
codelynx
0
120
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
230
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
4k
CSC307 Lecture 03
javiergs
PRO
1
490
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
1
100
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
150
Python’s True Superpower
hynek
0
140
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
230
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
180
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
220
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Building Adaptive Systems
keathley
44
2.9k
Discover your Explorer Soul
emna__ayadi
2
1.1k
GitHub's CSS Performance
jonrohan
1032
470k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
280
Between Models and Reality
mayunak
1
200
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
950
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
470
Speed Design
sergeychernyshev
33
1.5k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
[SF Ruby Conf 2025] Rails X
palkan
1
770
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
160
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