如何在运行测试时禁用Fabric

时间:2017-10-06 15:30:03

标签: android kotlin android-testing google-fabric

如何在运行测试时禁用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

这样的全局布尔值

3 个答案:

答案 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。

在应用程序启动时初始化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());
}