月: 2023年3月

[CI] Bitriseの仮想デバイステストで毎回異なるUIテストにタイムアウトで失敗する

Bitrise内で仮想デバイスを起動してUIテストを実行することが可能です。

https://github.com/bitrise-steplib/steps-virtual-device-testing-for-android

Bitriseのワークフローにvirtual device testiong for androidを追加するとandroidTest内に書かれたテストコードが自動で実行されます。内部ではFirebaseTestLabを使っておりそれをBitriseから呼び出しています。

UIテストが充実してくるとタイムアウトでテストが失敗してしまいます。

調べてみるとBitriseのUIテストのデフォルトタイムアウト時間は900秒(15分)に設定されているため、タイムアウトするようです。Bitriseの設定からUIテストの実行時間を最大秒数となる3600秒(60分)を設定すればタイムアウトしなくなります。
Bitrise上のUIテストの実行時間とFirebase上のUIテストの実行時間は異なるので注意してください。今回の設定はFirebase上のUIテストのタイムアウト時間です。Bitrise上だと15分のUIテストは約20分で表示されます。

(ところでなぜデフォルト900秒なのでしょうか…)

[Android] TextViewの複数の文字列を装飾する

TextViewを使っている時に複数の文字列を太字にする場合は下記のような拡張関数を書いておくと便利です。

import android.graphics.Typeface
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.widget.TextView
import android.text.style.StyleSpan

fun TextView.addBold(boldText: String) {
    val builder = SpannableStringBuilder(text)
    text.forEachIndexed { index, _ ->
        val startIndex = text.indexOf(boldText, index)
        if (startIndex < 0) return@forEachIndexed
        val endIndex = startIndex + boldText.length
        builder.setSpan(StyleSpan(Typeface.BOLD), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
    text = builder
}

TextViewに「あいう かきく あいう」という文字列を設定しておいてtextView.addBold(“あいう”)を実行すると下記のようになります。

Typeface.BOLDの部分をTypeface.ITALICにすると斜体になります。StyleSpan(Typeface.BOLD)の部分をBackgroundColorSpan(Color.RED)にすると背景が赤くなります。

注意点としては下記のようにspanを一度インスタンス化してから使うと1箇所しか装飾されないので都度spanインスタンスを作成しましょう。

fun TextView.addBold(boldText: String) {
    val builder = SpannableStringBuilder(text)
    val span = StyleSpan(Typeface.BOLD)
    text.forEachIndexed { index, _ ->
        val startIndex = text.indexOf(boldText, index)
        if (startIndex < 0) return@forEachIndexed
        val endIndex = startIndex + boldText.length
        // spanインスタンスを使い回すと複数箇所の装飾ができない
        builder.setSpan(span, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
    text = builder
}