SemanticsNodeInteraction.captureToImage() возвращает немного другой результат в зависимости от устройства/составного
Моя цель — протестировать цвета моих композиций. По какой-то причине приведенное ниже утверждение не работает на конкретном устройстве/компоновке (например, Composable1 проходит на Device1 и на Emulator1, Composable2 не работает на Device1, но проходит на Emulator1). Разница в цвете незначительна (например, #3F3C34 / #403C34). Что может быть причиной этой проблемы? Есть ли способ получить согласованные результаты, помимо небольшой разницы в утверждении цвета?
internal fun SemanticsNodeInteraction.assertColorAtRelativePositionStrict(
expected: Color,
@FloatRange(from = 0.0, to = 1.0) xPercentage: Float,
@FloatRange(from = 0.0, to = 1.0) yPercentage: Float,
): SemanticsNodeInteraction {
val bitmap = captureToImage().asAndroidBitmap()
val x = ((bitmap.width - 1) * xPercentage).roundToInt()
val y = ((bitmap.height - 1) * yPercentage).roundToInt()
val capturedColor = bitmap.getColor(x, y)
assert(capturedColor == expected) {
"Captured color was ${capturedColor.toArgb().toHexString()} " +
"but expected ${expected.toArgb().toHexString()}."
}
return this
}
private fun Int.toHexString() = String.format("#%06X", (0xFFFFFF and this))
Ожидаемый цвет и цвет, используемые в compoasable, берутся из colors.xml.
1 ответ
Я думаю, что эта проблема возникла из-за разного размера dp / пикселя для каждого устройства. Я бы порекомендовал создать более изолированный виджет создания, чтобы улучшить стабильность теста.