Как отключить ткань при выполнении теста

Как отключить Fabric: Crashlytics и Answer при запуске теста?

Есть ли другой способ отключить Crashlytics во время теста вместо того, чтобы помещать этот код перед каждым тестом?

@LargeTest @RunWith(AndroidJUnit4::class) class AcceptanceTest { @Before fun setUp() { val crashlyticsKit = Crashlytics.Builder() .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build() Fabric.with(InstrumentationRegistry.getContext(), crashlyticsKit) } } 

и избегая ставить глобальное логическое значение, такое как IS_TEST_MODE

Я нахожу лучший и более чистый способ отключить и управлять Fabric.

В моем приложении я использую slf4j-api , API журналов, который много используется в веб-разработке. С помощью этого API вы можете создавать appender, поэтому я решил создать Fabric Appender и использовать этот appender только при запуске приложения.

Как

Установить slf4j с помощью Logback

Установите свой build.gradle

 dependencies { ... // Log compile 'com.github.tony19:logback-android-core:1.1.1-6' compile 'com.github.tony19:logback-android-classic:1.1.1-6' compile 'org.slf4j:slf4j-api:1.7.21' } 

Добавить src/main/assets/logback.xml

 <configuration> <appender name="FABRIC" class="path/to/your/FabricAppender" /> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="LOGCAT" /> <appender-ref ref="FABRIC" /> </root> 

По умолчанию Logback имеет настраиваемое приложение, работающее с Logback . Вы можете прокомментировать часть FABRIC мы объясним позже.

Добавить src/androidTest/assets/logback.xml

 <configuration> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="LOGCAT" /> </root> </configuration> 

Вы не хотите, чтобы здесь было приложение Fabric! потому что вы хотите, чтобы ваш инструментальный тест работал только с Logcat

Использовать Logback

Теперь вы можете легко зарегистрироваться с помощью мощного API slf4j как slf4j ниже.

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) log.info("Activity start") // ... } } 

Установить ткань для Logback

Создайте в своем проекте FabricAppender.kt

 package your.package.log import android.content.Context import ch.qos.logback.classic.Level import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.classic.spi.ThrowableProxy import ch.qos.logback.core.UnsynchronizedAppenderBase import com.crashlytics.android.Crashlytics import com.crashlytics.android.answers.Answers import com.crashlytics.android.answers.CustomEvent import io.fabric.sdk.android.Fabric class FabricAppender : UnsynchronizedAppenderBase<ILoggingEvent>() { companion object { private var isFabricInit = false fun init(context: Context) { Fabric.with(context, Crashlytics(), Answers()) isFabricInit = true } } override fun append(event: ILoggingEvent) { if (isFabricInit.not()) return when (event.level.levelInt) { Level.ERROR_INT -> { val throwable = (event.throwableProxy as ThrowableProxy).throwable if (throwable != null) { Crashlytics.logException(throwable) } else { Crashlytics.log(event.message.replace(": {}", "")) } } } } } 

Этот appender отправит исключение в Crashlytics каждый раз, когда вы вызываете log.error("Something wrong happen!!") . Как вы можете видеть, вы можете полностью настроить приложение.

Инициализировать приложение при запуске приложения

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) FabricAppender.init(this) // Init before the first log log.info("Activity start") // ... } } 

в заключение

Теперь ваша ткань будет полностью изолирована от вашего кода, используя API slf4j , и не будет использоваться во время вашего инструментального теста yataaa !!! Вы можете найти другое приложение в Интернете (отправить в ELK, файл и т. Д.)

Используйте ароматизаторы.

По умолчанию у вас есть аромат main , где вы должны поместить всю базу своего кода, активов и манифестаций, которые используются в разработке, тестировании и производстве. Вы можете легко создать новый аромат, добавив название вашего вкуса в buildTypes { ... } в файле build.gradle вашего модуля. Это позволяет разделить зависимости и легко удалить все, что вам не нужно или даже понадобиться в ваших выпусках. Здесь вы можете узнать больше об ароматах. Таким образом, вы сможете отделить основной код от основного аромата и добавить crashlytics только в своих версиях.

Например, в вашем основном аромате:

 open class BaseApplication : Application() { fun onCreate() { [common code between flavors] } } 

Затем в вашем выпуске аромат

 open class MainApplication : BaseApplication() { fun onCreate() { [initialize crashlytics] } } 

И в ваших других ароматах

 open class MainApplication : BaseApplication() 

Примечание. Используйте MainApplication вместо BaseApplication в манифесте.