A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

improve tests speed and flakiness

razeeman (Apr 3, 2021, 11:41 AM +0300) 07ffcebb fedb1eb7

+132 -81
+4 -2
app/src/androidTest/java/com/example/util/simpletimetracker/AddCategoryTest.kt
··· 39 39 val lastColorPosition = ColorMapper.getAvailableColors().size - 1 40 40 41 41 // Add activities 42 - NavUtils.addActivity(typeName1) 43 - NavUtils.addActivity(typeName2) 42 + testUtils.addActivity(typeName1) 43 + testUtils.addActivity(typeName2) 44 44 45 + NavUtils.openSettingsScreen() 45 46 NavUtils.openCategoriesScreen() 46 47 clickOnViewWithText(R.string.categories_add) 47 48 closeSoftKeyboard() ··· 121 122 122 123 @Test 123 124 fun addCategoryTypesEmpty() { 125 + NavUtils.openSettingsScreen() 124 126 NavUtils.openCategoriesScreen() 125 127 clickOnViewWithText(R.string.categories_add) 126 128
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt
··· 40 40 val comment = "Comment" 41 41 42 42 // Add activity 43 - NavUtils.addActivity(name, color, icon) 43 + testUtils.addActivity(name, color, icon) 44 44 45 45 // Add record 46 46 NavUtils.openRecordsScreen()
+1
app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt
··· 44 44 val lastIcon = iconMapper.availableIconsNames.values.last() 45 45 val lastIconPosition = iconMapper.availableIconsNames.size - 1 46 46 47 + NavUtils.openSettingsScreen() 47 48 NavUtils.openCategoriesScreen() 48 49 NavUtils.addCategory(categoryName1) 49 50 NavUtils.addCategory(categoryName2)
+3 -2
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeCategoryTest.kt
··· 37 37 val lastColor = ColorMapper.getAvailableColors().last() 38 38 39 39 // Add activities 40 - NavUtils.addActivity(typeName1) 41 - NavUtils.addActivity(typeName2) 40 + testUtils.addActivity(typeName1) 41 + testUtils.addActivity(typeName2) 42 42 43 43 // Add category 44 + NavUtils.openSettingsScreen() 44 45 NavUtils.openCategoriesScreen() 45 46 NavUtils.addCategory(name, firstColor, listOf(typeName1)) 46 47
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt
··· 47 47 val newComment = "new comment" 48 48 49 49 // Add activities 50 - NavUtils.addActivity(name, firstColor, firstIcon) 51 - NavUtils.addActivity(newName, lastColor, lastIcon) 50 + testUtils.addActivity(name, firstColor, firstIcon) 51 + testUtils.addActivity(newName, lastColor, lastIcon) 52 52 53 53 // Add record 54 54 NavUtils.openRecordsScreen()
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeUntrackedTest.kt
··· 33 33 val icon = iconMapper.availableIconsNames.values.first() 34 34 35 35 // Add activity 36 - NavUtils.addActivity(name, color, icon) 36 + testUtils.addActivity(name, color, icon) 37 37 38 38 // Open edit view 39 39 NavUtils.openRecordsScreen()
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTest.kt
··· 30 30 val icon = iconMapper.availableIconsNames.values.first() 31 31 32 32 // Add activity 33 - NavUtils.addActivity(name, color, icon) 33 + testUtils.addActivity(name, color, icon) 34 34 35 35 // Add record 36 36 NavUtils.openRecordsScreen()
+4 -11
app/src/androidTest/java/com/example/util/simpletimetracker/MessagesTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 - import androidx.test.espresso.Espresso.closeSoftKeyboard 4 - import androidx.test.espresso.Espresso.pressBack 5 3 import androidx.test.ext.junit.runners.AndroidJUnit4 6 4 import com.example.util.simpletimetracker.utils.BaseUiTest 7 5 import com.example.util.simpletimetracker.utils.NavUtils ··· 16 14 class MessagesTest : BaseUiTest() { 17 15 18 16 @Test 19 - fun messages() { 20 - // Activity with no name 17 + fun messageRecordTypeName() { 21 18 tryAction { clickOnViewWithText(R.string.running_records_add_type) } 22 19 clickOnViewWithText(R.string.change_record_type_save) 23 20 toastTextShowing(R.string.change_record_message_choose_name) 24 - closeSoftKeyboard() 25 - pressBack() 21 + } 26 22 27 - // Add record 23 + @Test 24 + fun messageRecordActivity() { 28 25 NavUtils.openRecordsScreen() 29 26 clickOnViewWithId(R.id.btnRecordAdd) 30 - 31 - // Record with no activity 32 - // Wait for previous message to disappear 33 - Thread.sleep(5000) 34 27 clickOnViewWithText(R.string.change_record_save) 35 28 toastTextShowing(R.string.message_choose_type) 36 29 }
+5 -2
app/src/androidTest/java/com/example/util/simpletimetracker/RecordTypeCategoryTest.kt
··· 26 26 val typeName2 = "Type2" 27 27 28 28 // Add category 29 + NavUtils.openSettingsScreen() 29 30 NavUtils.openCategoriesScreen() 30 31 NavUtils.addCategory(categoryName1) 31 32 NavUtils.addCategory(categoryName2) ··· 33 34 34 35 // Add activities 35 36 NavUtils.openRunningRecordsScreen() 36 - NavUtils.addActivity(typeName1, categories = listOf(categoryName1)) 37 - NavUtils.addActivity(typeName2, categories = listOf(categoryName2)) 37 + testUtils.addActivity(typeName1, categories = listOf(categoryName1)) 38 + testUtils.addActivity(typeName2, categories = listOf(categoryName2)) 38 39 39 40 // Check first category 41 + NavUtils.openSettingsScreen() 40 42 NavUtils.openCategoriesScreen() 41 43 42 44 longClickOnView(withText(categoryName1)) ··· 92 94 clickOnViewWithText(R.string.change_record_type_save) 93 95 94 96 // Check first category again 97 + NavUtils.openSettingsScreen() 95 98 NavUtils.openCategoriesScreen() 96 99 97 100 longClickOnView(withText(categoryName1))
+15 -13
app/src/androidTest/java/com/example/util/simpletimetracker/RecordsAllTest.kt
··· 22 22 import com.example.util.simpletimetracker.utils.clickOnViewWithText 23 23 import com.example.util.simpletimetracker.utils.longClickOnView 24 24 import com.example.util.simpletimetracker.utils.nestedScrollTo 25 + import com.example.util.simpletimetracker.utils.tryAction 25 26 import com.example.util.simpletimetracker.utils.withCardColor 26 27 import com.example.util.simpletimetracker.utils.withPluralText 27 28 import org.hamcrest.CoreMatchers.allOf ··· 37 38 val comment = "comment" 38 39 39 40 // Add activity 40 - NavUtils.addActivity(name) 41 + testUtils.addActivity(name) 41 42 42 43 // Add records 43 44 NavUtils.openRecordsScreen() ··· 109 110 val name4 = "WithRecords" 110 111 111 112 // Add activity 112 - NavUtils.addActivity(name1) 113 - NavUtils.addActivity(name2) 114 - NavUtils.addActivity(name3) 115 - NavUtils.addActivity(name4) 113 + testUtils.addActivity(name1) 114 + testUtils.addActivity(name2) 115 + testUtils.addActivity(name3) 116 + testUtils.addActivity(name4) 116 117 117 118 // Delete one activity 118 - longClickOnView(withText(name3)) 119 + tryAction { longClickOnView(withText(name3)) } 119 120 clickOnViewWithId(R.id.btnChangeRecordTypeDelete) 120 121 121 122 // Add records 122 123 NavUtils.openRecordsScreen() 123 - NavUtils.addRecord(name1) 124 - NavUtils.addRecord(name2) 125 - NavUtils.addRecord(name4) 124 + testUtils.addRecord(name1) 125 + testUtils.addRecord(name2) 126 + testUtils.addRecord(name4) 126 127 127 128 // Delete another activity 128 129 NavUtils.openRunningRecordsScreen() ··· 204 205 val name = "Test" 205 206 206 207 // Add activity 207 - NavUtils.addActivity(name) 208 + testUtils.addActivity(name) 208 209 209 210 // Add records 210 211 NavUtils.openRecordsScreen() ··· 297 298 val categoryName2 = "category2" 298 299 299 300 // Add categories 301 + NavUtils.openSettingsScreen() 300 302 NavUtils.openCategoriesScreen() 301 303 NavUtils.addCategory(categoryName1) 302 304 NavUtils.addCategory(categoryName2) ··· 304 306 305 307 // Add activity 306 308 NavUtils.openRunningRecordsScreen() 307 - NavUtils.addActivity(typeName1, color1, categories = listOf(categoryName1)) 308 - NavUtils.addActivity(typeName2, color2, categories = listOf(categoryName1)) 309 - NavUtils.addActivity(typeName3, color3, categories = listOf(categoryName2)) 309 + testUtils.addActivity(typeName1, color1, categories = listOf(categoryName1)) 310 + testUtils.addActivity(typeName2, color2, categories = listOf(categoryName1)) 311 + testUtils.addActivity(typeName3, color3, categories = listOf(categoryName2)) 310 312 311 313 // Add records 312 314 NavUtils.openRecordsScreen()
+28 -24
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt
··· 26 26 import com.example.util.simpletimetracker.utils.clickOnViewWithText 27 27 import com.example.util.simpletimetracker.utils.drag 28 28 import com.example.util.simpletimetracker.utils.nestedScrollTo 29 + import com.example.util.simpletimetracker.utils.tryAction 29 30 import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 30 31 import org.hamcrest.CoreMatchers.allOf 31 32 import org.hamcrest.Matcher ··· 42 43 val icon = iconMapper.availableIconsNames.values.first() 43 44 44 45 // Add activity 45 - NavUtils.addActivity(name, color, icon) 46 + testUtils.addActivity(name, color, icon) 46 47 47 48 // Untracked is shown 48 49 NavUtils.openRecordsScreen() ··· 62 63 ) 63 64 64 65 // Add record 65 - NavUtils.openRecordsScreen() 66 66 NavUtils.addRecord(name) 67 67 checkViewDoesNotExist( 68 68 allOf(withText(R.string.untracked_time_name), isCompletelyDisplayed()) ··· 89 89 val name3 = "Test3" 90 90 91 91 // Add activities 92 - NavUtils.addActivity(name1) 93 - NavUtils.addActivity(name2) 94 - NavUtils.addActivity(name3) 92 + testUtils.addActivity(name1) 93 + testUtils.addActivity(name2) 94 + testUtils.addActivity(name3) 95 95 96 96 // Start timers 97 - clickOnViewWithText(name1) 97 + tryAction { clickOnViewWithText(name1) } 98 98 clickOnViewWithText(name2) 99 99 clickOnViewWithText(name3) 100 100 var startTime = System.currentTimeMillis() ··· 226 226 val name3 = "Test3" 227 227 228 228 // Add activities 229 - NavUtils.addActivity(name1) 230 - NavUtils.addActivity(name2) 231 - NavUtils.addActivity(name3) 229 + testUtils.addActivity(name1) 230 + testUtils.addActivity(name2) 231 + testUtils.addActivity(name3) 232 232 233 - check(name1, name2) { matcher -> isCompletelyLeftOf(matcher) } 233 + tryAction { check(name1, name2) { matcher -> isCompletelyLeftOf(matcher) } } 234 234 check(name2, name3) { matcher -> isCompletelyLeftOf(matcher) } 235 235 236 236 // Open settings ··· 287 287 val color2 = ColorMapper.getAvailableColors().last() 288 288 289 289 // Add activities 290 - NavUtils.addActivity(name1, color2) 291 - NavUtils.addActivity(name2, color1) 290 + testUtils.addActivity(name1, color2) 291 + testUtils.addActivity(name2, color1) 292 292 293 293 // Check order 294 - check(name1, name2) { matcher -> isCompletelyLeftOf(matcher) } 294 + tryAction { check(name1, name2) { matcher -> isCompletelyLeftOf(matcher) } } 295 295 296 296 // Check settings 297 297 NavUtils.openSettingsScreen() ··· 309 309 val color2 = ColorMapper.getAvailableColors().last() 310 310 311 311 // Add activities 312 - NavUtils.addActivity(name1, color2) 313 - NavUtils.addActivity(name2, color1) 312 + testUtils.addActivity(name1, color2) 313 + testUtils.addActivity(name2, color1) 314 314 315 315 // Change settings 316 316 NavUtils.openSettingsScreen() ··· 333 333 val name3 = "Test3" 334 334 335 335 // Add activities 336 - NavUtils.addActivity(name1) 337 - NavUtils.addActivity(name2) 338 - NavUtils.addActivity(name3) 336 + testUtils.addActivity(name1) 337 + testUtils.addActivity(name2) 338 + testUtils.addActivity(name3) 339 339 340 340 // Change settings 341 341 NavUtils.openSettingsScreen() ··· 383 383 val name2 = "Test2" 384 384 385 385 // Add activities 386 - NavUtils.addActivity(name1) 387 - NavUtils.addActivity(name2) 386 + testUtils.addActivity(name1) 387 + testUtils.addActivity(name2) 388 388 389 389 // Start one timer 390 - clickOnViewWithText(name1) 390 + tryAction { clickOnViewWithText(name1) } 391 391 392 392 // Change settings 393 393 NavUtils.openSettingsScreen() ··· 417 417 val name2 = "Test2" 418 418 419 419 // Add activities 420 - NavUtils.addActivity(name1) 421 - NavUtils.addActivity(name2) 420 + testUtils.addActivity(name1) 421 + testUtils.addActivity(name2) 422 422 423 423 // Start one timer 424 - clickOnViewWithText(name1) 424 + tryAction { clickOnViewWithText(name1) } 425 + 426 + // Add record 427 + testUtils.addRecord(name1) 428 + testUtils.addRecord(name2) 425 429 426 430 // Change settings 427 431 NavUtils.openSettingsScreen()
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt
··· 39 39 val icon = iconMapper.availableIconsNames.values.first() 40 40 41 41 // Add activity 42 - NavUtils.addActivity(name, color, icon) 42 + testUtils.addActivity(name, color, icon) 43 43 44 44 // Add record 45 45 NavUtils.openRecordsScreen() 46 - NavUtils.addRecord(name) 46 + testUtils.addRecord(name) 47 47 48 48 // Add record 49 49 clickOnViewWithId(R.id.btnRecordsContainerPrevious)
+4 -4
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsFilterTest.kt
··· 30 30 val lastIcon = iconMapper.availableIconsNames.values.last() 31 31 32 32 // Add activities 33 - NavUtils.addActivity(name, firstColor, firstIcon) 34 - NavUtils.addActivity(newName, lastColor, lastIcon) 33 + testUtils.addActivity(name, firstColor, firstIcon) 34 + testUtils.addActivity(newName, lastColor, lastIcon) 35 35 36 36 // Add records 37 37 NavUtils.openRecordsScreen() 38 - NavUtils.addRecord(name) 39 - NavUtils.addRecord(newName) 38 + testUtils.addRecord(name) 39 + testUtils.addRecord(newName) 40 40 41 41 NavUtils.openStatisticsScreen() 42 42
+3 -2
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsRangesTest.kt
··· 18 18 import com.example.util.simpletimetracker.utils.clickOnViewWithId 19 19 import com.example.util.simpletimetracker.utils.clickOnViewWithText 20 20 import com.example.util.simpletimetracker.utils.longClickOnViewWithId 21 + import com.example.util.simpletimetracker.utils.tryAction 21 22 import org.hamcrest.CoreMatchers.allOf 22 23 import org.hamcrest.CoreMatchers.equalTo 23 24 import org.junit.Test ··· 34 35 val name = "Test" 35 36 36 37 // Add activity 37 - NavUtils.addActivity(name) 38 + testUtils.addActivity(name) 38 39 39 40 // Start timer 40 - clickOnViewWithText(name) 41 + tryAction { clickOnViewWithText(name) } 41 42 clickOnView(allOf(isDescendantOfA(withId(R.id.viewRunningRecordItem)), withText(name))) 42 43 43 44 // Statistics
+13 -12
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt
··· 34 34 val lastIcon = iconMapper.availableIconsNames.values.last() 35 35 36 36 // Add activities 37 - NavUtils.addActivity(name, firstColor, firstIcon) 38 - NavUtils.addActivity(newName, lastColor, lastIcon) 37 + testUtils.addActivity(name, firstColor, firstIcon) 38 + testUtils.addActivity(newName, lastColor, lastIcon) 39 39 40 40 // Add records 41 41 NavUtils.openRecordsScreen() 42 - NavUtils.addRecord(name) 43 - NavUtils.addRecord(newName) 42 + testUtils.addRecord(name) 43 + testUtils.addRecord(newName) 44 44 45 45 NavUtils.openStatisticsScreen() 46 46 ··· 213 213 val lastColor = ColorMapper.getAvailableColors().last() 214 214 215 215 // Add categories 216 + NavUtils.openSettingsScreen() 216 217 NavUtils.openCategoriesScreen() 217 218 NavUtils.addCategory(categoryName1, firstColor) 218 219 NavUtils.addCategory(categoryName2, lastColor) ··· 221 222 222 223 // Add activities 223 224 NavUtils.openRunningRecordsScreen() 224 - NavUtils.addActivity(typeName1, categories = listOf(categoryName1)) 225 - NavUtils.addActivity(typeName2, categories = listOf(categoryName1)) 226 - NavUtils.addActivity(typeName3, categories = listOf(categoryName2)) 227 - NavUtils.addActivity(typeName4, categories = listOf(categoryName1, categoryName2)) 225 + testUtils.addActivity(typeName1, categories = listOf(categoryName1)) 226 + testUtils.addActivity(typeName2, categories = listOf(categoryName1)) 227 + testUtils.addActivity(typeName3, categories = listOf(categoryName2)) 228 + testUtils.addActivity(typeName4, categories = listOf(categoryName1, categoryName2)) 228 229 229 230 // Add records 230 231 NavUtils.openRecordsScreen() 231 - NavUtils.addRecord(typeName1) 232 - NavUtils.addRecord(typeName2) 233 - NavUtils.addRecord(typeName3) 234 - NavUtils.addRecord(typeName4) 232 + testUtils.addRecord(typeName1) 233 + testUtils.addRecord(typeName2) 234 + testUtils.addRecord(typeName3) 235 + testUtils.addRecord(typeName4) 235 236 236 237 NavUtils.openStatisticsScreen() 237 238 clickOnViewWithIdOnPager(R.id.btnStatisticsChartFilter)
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/ZeroDurationRecordTest.kt
··· 29 29 val name = "Name" 30 30 31 31 // Add activity 32 - NavUtils.addActivity(name) 32 + testUtils.addActivity(name) 33 33 34 34 // Add record 35 35 NavUtils.openRecordsScreen()
+4
app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt
··· 33 33 @JvmField 34 34 val activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) 35 35 36 + @Rule 37 + @JvmField 38 + val mRetryTestRule = RetryTestRule() 39 + 36 40 init { 37 41 inject() 38 42 }
-1
app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt
··· 35 35 } 36 36 37 37 fun openCategoriesScreen() { 38 - openSettingsScreen() 39 38 onView(withText(R.string.settings_edit_categories)).perform(nestedScrollTo(), click()) 40 39 } 41 40
+40
app/src/androidTest/java/com/example/util/simpletimetracker/utils/RetryTestRule.kt
··· 1 + package com.example.util.simpletimetracker.utils 2 + 3 + import android.util.Log 4 + import org.junit.rules.TestRule 5 + import org.junit.runner.Description 6 + import org.junit.runners.model.Statement 7 + 8 + /** 9 + * Retry test rule used to retry test that failed. 10 + */ 11 + class RetryTestRule(val retryCount: Int = 5) : TestRule { 12 + 13 + private val tag: String = RetryTestRule::class.java.simpleName 14 + 15 + override fun apply(base: Statement, description: Description): Statement { 16 + return statement(base, description) 17 + } 18 + 19 + private fun statement(base: Statement, description: Description): Statement { 20 + return object : Statement() { 21 + @Throws(Throwable::class) 22 + override fun evaluate() { 23 + var caughtThrowable: Throwable? = null 24 + 25 + for (i in 0 until retryCount) { 26 + try { 27 + base.evaluate() 28 + return 29 + } catch (t: Throwable) { 30 + caughtThrowable = t 31 + Log.e(tag, "${description.displayName}: run ${i + 1} failed") 32 + } 33 + } 34 + 35 + Log.e(tag, "${description.displayName}: giving up after $retryCount failures") 36 + throw caughtThrowable!! 37 + } 38 + } 39 + } 40 + }