Android
dependencies {
androidTestImplementation("dev.tracera:tracera-android:<version>")
// Optional — richer screenshots (quality/scale) + hierarchy via UiDevice:
// androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
// Robolectric (host):
// testImplementation("dev.tracera:tracera-android:<version>")
}
Требуются JDK ≥ 17, Android minSdk ≥ 26 и AndroidX Test (JUnit 4 / AndroidJUnitRunner). Предпочтительно @RunWith(TraceraAndroidJUnit4::class) (см. Адаптеры автотестов). tracera-android на Maven Central.
Переменные окружения и режим прогона: Адаптеры автотестов.
Задайте TRACERA_* через testInstrumentationRunnerArguments (или am instrument -e).
android {
defaultConfig {
testInstrumentationRunner = "dev.tracera.TraceraAndroidJUnitRunner"
testInstrumentationRunnerArguments += mapOf(
"TRACERA_BASE_URL" to "https://app.example",
"TRACERA_AUTOTEST_TOKEN" to System.getenv("TRACERA_AUTOTEST_TOKEN")!!,
"TRACERA_PROJECT_ID" to "1",
)
}
}
Привязка testCaseId и autotestName
Импортируйте стандартные API JUnit 4 / AndroidX Test как обычно, а из dev.tracera — Tracera.
В объявлении (предпочтительно — привязка сработает, даже если тест сразу уйдёт в skip):
import dev.tracera.TraceraAndroidJUnit4
import dev.tracera.Tracera
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(TraceraAndroidJUnit4::class)
class LoginTest {
@Tracera.Id(42, name = "e2e/login")
@Test
fun login() {
assert(true)
}
}
Внутри теста:
import dev.tracera.TraceraAndroidJUnit4
import dev.tracera.Tracera
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(TraceraAndroidJUnit4::class)
class LoginTest {
@Test
fun login() {
Tracera.testCase(42, "e2e/login")
assert(true)
}
}
Пропуск
Используйте стандартный skip JUnit (Assume.assumeTrue, @Ignore, …). Причина пропуска добавляется в результат как comment.
Шаги
Используйте Tracera.step("…") { … } или Tracera.suspendStep("…") { … } для корутин. Вложенность — через Tracera.step("…") { … }. Шаги внутри @Before / @After попадают в Предусловие / Постусловие результата; шаги внутри теста — в Тест. @BeforeClass / @AfterClass в отчёт не попадают.
На устройстве используйте Tracera.step("…") { … } — ART не поддерживает инструментирование шагов на методах. На Robolectric / host JVM @Tracera.Step на методах работает как у остальных JVM-раннеров.
import dev.tracera.TraceraAndroidJUnit4
import dev.tracera.Tracera
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(TraceraAndroidJUnit4::class)
class CheckoutTest {
@Before
fun openShop() {
Tracera.step("open shop") { }
}
@Tracera.Id(10, name = "e2e/checkout")
@Test
fun checkout() {
Tracera.step("body outer") {
Tracera.step("nested leaf") { }
}
Tracera.step("pay") { }
}
}
Комментарии, ошибки и вложения
Комментарии, ошибки и вложения: Адаптеры автотестов.
Tracera.comment("result-level note")
Tracera.error("result-level error text")
Tracera.step("open login") {
Tracera.comment("landed on login")
}
Скриншоты и отладка на устройстве
Скриншоты, logcat и иерархия окон — по желанию (не автоматически). Вставьте три rule на класс теста (или базовый класс). Скриншоты работают без дополнительных зависимостей; androidx.test.uiautomator:uiautomator нужен только если хотите quality / scale у Tracera.screenshot (и hierarchy через UiDevice).
ScreenshotRule.Mode: FAILURE (по умолчанию), SUCCESS или END.
import dev.tracera.LogcatRule
import dev.tracera.ScreenshotRule
import dev.tracera.Tracera
import dev.tracera.TraceraAndroidJUnit4
import dev.tracera.WindowHierarchyRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(TraceraAndroidJUnit4::class)
class LoginDebugTest {
@get:Rule
val screenshots = ScreenshotRule(mode = ScreenshotRule.Mode.FAILURE, fileName = "failure.png")
@get:Rule
val logcat = LogcatRule()
@get:Rule
val hierarchy = WindowHierarchyRule()
@Tracera.Id(42, name = "e2e/login")
@Test
fun login() {
// Optional mid-test shot:
// Tracera.screenshot("login.png", quality = 90, scale = 1.0f)
assert(true)
}
}
Параметризованные тесты
Используйте @RunWith(Parameterized::class). Укажите @Tracera.Id на методе. В необязательном name можно использовать {param_id} — имя теста в JUnit (например login[ok]). Если name не указан, то autotestName принимает значение имени теста в JUnit. Поля из конструктора в шаблон не подставляются: если они нужны в имени, вызовите Tracera.testCase внутри теста.
import dev.tracera.Tracera
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
class LoginRows(private val login: String) {
companion object {
@JvmStatic
@Parameterized.Parameters(name = "{0}")
fun data() = listOf(arrayOf("ok"), arrayOf("sso"))
}
@Before
fun openForm() {
Tracera.step("open form") { }
}
@Tracera.Id(42, name = "login as {param_id}")
@Test
fun login() {
assert(login.isNotEmpty())
}
}