如何在运行测试时禁用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
答案 0 :(得分:2)
我找到了一种更好,更清洁的方式来禁用和管理Fabric。
在我的应用程序中,我使用了slf4j-api
,这是一个在Web开发中经常使用的日志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 appender!因为您希望您的检测测试只能使用Logcat
Logback
现在,您可以使用slf4j
的强大API轻松登录,如下所示
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(": {}", ""))
}
}
}
}
}
每次致电Crashlytics
时,此附加功能都会向log.error("Something wrong happen!!")
发送异常。如您所见,您可以完全自定义appender。
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")
// ...
} }
现在,您的结构将使用slf4j
API与您的代码完全隔离,并且在您的仪器化测试yataaa期间将无法使用!您可以在互联网上找到其他appender(发送给ELK,文件等)
答案 1 :(得分:1)
使用香精。
默认情况下,您有一个名为main
的风格,您应该在其中放置用于开发,测试和生产的所有代码,资产和清单。您可以通过在模块的build.gradle文件中的buildTypes { ... }
下添加flavor名称来轻松创建新的flavor。这使您可以拆分依赖项并轻松删除任何您不希望甚至需要在发布版本中使用的内容。您可以阅读有关香精here的更多信息。这样,您就可以将主要代码中的核心代码分开,并仅在发布版本中添加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
。
答案 2 :(得分:0)
我们没有在每次Espresso测试中禁用它,而是避免在运行调试构建类型时启用它。
因此,在您的Application
类中,像这样构建Crashlytics和Answers:
CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(this,
new Crashlytics.Builder().core(crashlyticsCore).build(),
new Answers());
}