Свойства математического ожидания
- Математическое ожидание постоянной величины равно самой постоянной $M( C )=C$
- Постоянный множитель можно выносить за знак М.О. $M( { X\cdot C } )=C\cdot M( X )$
- М.О. 2-х независимых с.в. равно произведению математических ожиданий $M( { X\cdot Y } )=M( X )\cdot M( Y )$ Следствие св. 3 М.О. нескольких независимых с.в. есть произведение М.О. $M( { X_1 \cdot X_2 \cdot \ldots \cdot X_n } )=M( { X_1 } )\cdot M( { X_2 } )\cdot \ldots \cdot M( { X_n } )$
- М.О. суммы двух с.в. есть сумма М.О. $M( { X+Y } )=M( X )+M( Y )$
4 $M( { X_1 +X_2 +\ldots +X_n } )=M( { X_1 } )+M( { X_2 } )+\ldots +M( { X_n } )$
Теорема: Пусть производится n- независимых испытаний. Вероятность появления события $A$ постоянна и равна р. Тогда М.О. числа появления события $A$ в $n$ — независимых испытаниях есть $M( X )= np$
Пример. Дано два закона распределения дискретных случайных величин
$$ \begin{array} { c|lcr } \Psi & 0.5 & 1 \\ \hline P & 0.3 & 0.7 \\ \end{array} $$
$$ \begin{array} { c|lcr } \xi & \xi _1 =1 & \xi _2 =2 \\ \hline P & 0.2 & 0.8 \\ \end{array} $$
Найти М.О. произведения случайных величин $M( { \xi \cdot \Psi } )=M( \xi )\cdot M( \Psi )=( { 1\cdot 0,2+2\cdot 0,8 } )\cdot ( { 0,5\cdot 0,3+1\cdot 0,7 } )=1,53$
Отклонение С.В. от ее математического ожидания
Пусть $X$ — случайная величина. Тогда $M( X )$- ее
М. О. Рассмотрим разность $X-M( X )$.
Опр. Отклонением называется разность между значением С.В. и ее М.О. $X-M( X )-$отклонение
Пусть с.в. имеет закон распределения $$ \begin{array} { c|lcr } X & x_1 & x_2 & \cdots & x_n \\ \hline P & p_1 & p_2 & \cdots & p_n \\ \end{array} $$
Напишем закон распределения для отклонения. Для того, чтобы отклонение приняло значение $x_1 -M( X )$ достаточно, чтобы С.В. приняла значение $x_1 $. Вероятность этого события $p_1 $. Следовательно, вероятность отклонения $x_1 -M( X )$ так же будет $p_1 $.
Тогда закон распределения для отклонения примет вид:
$$ \begin{array} { c|lcr } X-M( X ) & x_1 — M(x) & x_2 — M(x) & \cdots & x_n — M(x) \\ \hline P & p_1 & p_2 & \cdots & p_n \\ \end{array} $$
Теорема М.О. отклонения равно нулю. $M( { X-M( X ) } )=0$.
Далее:
Теорема Стокса
Поток жидкости через поверхность
Вычисление двойного интеграла. Двукратный интеграл
Критерий полноты {формулировка}. Лемма о нелинейной функции
Теорема о предполных классах
Теорема о заведомо полныx системаx
Теорема об аналоге СДНФ в Pk
Криволинейный интеграл первого рода
Соленоидальное векторное поле
Механические и физические приложения поверхностного интеграла первого рода
Полином Жегалкина. Теорема о представлении в виде полинома Жегалкина
Вычисление поверхностного интеграла первого рода
Класс Te . Теорема о замкнутости Te
Критерий полноты {формулировка}. Лемма о немонотонной функции
Механические приложения двойного интеграла
Огравление $\Rightarrow $
27 сентября 2016, 21:47 проектирование км, кмд, кж Теория вероятности [Калинин В. М., Тихомиров С.Р.] 0 4317 0
Свойства математического ожидания:
Математическое ожидание постоянной величины равно этой величине.
.
Математическое ожидание суммы (разности) двух или нескольких случайных величин иравно сумме (разности) их математических ожиданий:
.
Следствие. Если– постоянная величина, то
Математическое ожидание произведения двух независимыхслучайных величиниравно произведению их математических ожиданий:
.
Следствие. Математическое ожидание произведения несколькихвзаимно независимыхслучайных величин равно произведению математических ожиданий этих величин.
Следствие.
Постоянный множитель можно выносить
за знак математического ожидания, т. е..
Дисперсия случайной величины и ее свойства.
На практике часто требуется оценить рассеяние случайной величины вокруг ее среднего значения. Например, акции двух компаний могут приносить в среднем одинаковые дивиденды, однако вложение денег в одну из них может быть гораздо более рискованной операцией, чем в другую. Поэтому возникает необходимость в числовой характеристике, оценивающей разброс возможных значений случайной величины относительно ее среднего значения (математического ожидания). Такой характеристикой является дисперсия.
Дисперсией(рассеянием) случайной величиныназывают математическое ожидание квадрата отклонения этой величины от ее математического ожидания.
.
Легко показать, что вышеприведенное выражение может быть записано в виде
Действительно, используя основные теоремы о математическом ожидании, получим
В случае дискретнойслучайной величины, имеющей закон распределения
.
Для непрерывнойслучайной величины формула для расчета дисперсии имеет вид
Свойства дисперсии
1. Дисперсия постоянной величины равна нулю.
2.Постоянный множитель можно выносить за знак дисперсии, возводя его в квадрат:
.
3. Дисперсия суммы (разности) двух независимых случайных величин равна сумме дисперсий этих величин:
.Следствие 1. Дисперсия суммы нескольких взаимно независимых случайных величин равна сумме дисперсий этих величин.
Следствие 2. Если – постоянная величина, то.
Математическое ожидание и дисперсия случайной величины являются ее основными числовыми характеристиками.
Пример 1. Пусть закон распределения дискретной случайной величины имеет вид
1 |
2 |
3 |
4 |
5 | |
0,07 |
0,21 |
0,55 |
0,16 |
0,01 |
Найти
математическое ожидание и дисперсию
случайной величины X.
Решение:Рассчитаем вначале математическое ожидание
Дисперсия равна
Пример 2. Плотность вероятности непрерывной случайной величины равна
, где
Найти ее математическое ожидание и дисперсию.
Решение:Найдем математическое ожидание:
Далее,
Найдем дисперсию, используя формулу
.
Среднее квадратическое отклонение.
Для оценки рассеяния возможных значений случайной величины вокруг ее среднего значения кроме дисперсии служат и некоторые другие характеристики. К их числу относится среднее квадратическое отклонение.
Средним квадратическим отклонением(илистандартом) случайной величиныназывается корень квадратный из дисперсииэтой величины:.
Легко показать, что дисперсия имеет размерность, равную квадрату размерности случайной величины. Поэтому размерность совпадает с размерностью. В тех случаях, когда желательно, чтобы оценка рассеяния имела размерность случайной величины, вычисляют среднее квадратичное отклонение, а не дисперсию.
Понятие дисперсии и среднего квадратического отклонения широко используется практически во всех областях человеческой деятельности, связанных с процессами измерений. Так, например, в технике, они характеризуют точность измерительной аппаратуры (чем выше среднеквадратическое отклонение (разброс) при измерениях, тем хуже качество прибора).
Примерами использования данных параметров в экономике могут служить изучение риска различных действий со случайным исходом, в частности, при анализе риска инвестирования в ту или иную отрасль, при оценивании различных активов в портфеле ценных бумаг и т.д.
Пример.
Пусть имеется два варианта инвестирования со следующими характеристиками
Ожидаемая чистая прибыль инвестирования определяется математическим ожиданием и составляет:
Инвестиция 1:
Инвестиция 2:
По
ожидаемой прибыли предпочтительнее
1-й вариант. Однако мы не учли риск,
связанный с инвестициями. Этот риск
может быть определен с помощью дисперсии
и (или) среднего квадратического
отклонения. Используя результаты
таблицы, получим
Инвестиция 1:
Инвестиция 2:
Т.е. риск по варианту для инвестиции 1 меньше. Выбор – за ЛПР.
Лекция 8. Основные распределения случайной величины: биномиальное, Пуассона, геометрическое, гипергеометрическое, равномерное, показательное. Их математические ожидания и дисперсии.
Случайную величину полностью задает закон ее распределения (в дискретном случае), а также функция распределения или плотность вероятностей (для непрерывной случайной величины).
Наиболее
важными законами распределения дискретной
случайной величины являются биномиальный
закон, закон распределения Пуассона,
геометрическое и гипергеометрическое
распределение, а непрерывной – нормальное,
равномерное и показательное распределения.
Нормальное распределение будет
рассмотрено в одной из последующих
лекций.
Биномиальное распределение, его математическое ожидание и дисперсия.
Закон распределения случайной величины числа появлений событияв схеме Бернулли имеет вид,
где ,.
Эта формула еще называется биномиальной, так как её правая часть представляет собой -й член бинома Ньютона:.
Очевидно, что для закона биномиального распределения вероятностей выполняется условие нормировки, т.е. сумма всех вероятностей равна единице:.
Биномиальное распределение для и некоторых значенийприведено ниже
Математическое ожидание числа появлений события внезависимых испытаниях для биномиального распределения равно произведению числа испытаний на вероятность появления событияв каждом испытании (т.е. среднему числу появления события в данной серии испытаний).
Дисперсия и среднее квадратическое отклонения равны соответственно:
Прогресс и активность — Компоненты
Для представления каждого типа операции следует использовать один визуальный индикатор. Например, операция обновления должна отображать либо полосу обновления, либо кружок активности, но не то и другое одновременно.
Индикаторы определения показывают, сколько времени займет операция.
Неопределенные индикаторы визуализируют неопределенное время ожидания.
Типы
Линейные
Круговые
Поведение
Загрузка контента поэтапно
Загрузка дополнительного контента
Типы индикаторов Развернуть и свернуть содержимоеСтрелка, указывающая вниз при сворачивании и вверх при раскрытии.
Когда индикаторы определяют , они показывают, сколько времени займет операция, когда можно определить процент завершения.
Когда индикаторы равны неопределенный они просят пользователя подождать, пока что-то завершится, когда нет необходимости указывать, сколько времени это займет.
Как линейные, так и круговые индикаторы выполнения могут быть как определенными, так и неопределенными.
Линейный индикатор прогресса должен всегда заполняться от 0% до 100% и никогда не уменьшаться в значении. Он должен быть представлен полосами на краю заголовка или листа, которые появляются и исчезают.
Для многократных операций происходит последовательно, используйте индикатор для представления хода выполнения в целом, а не каждой отдельной операции.
Линейные индикаторы хода
Индикатор выполнения буферизации видео
Индикатор запроса на веб-странице
Циркулярные неопределенные и детерминированные индикаторы прогресса
Циркулярные с интегрированием
Круговой загрузчик может быть интегрирован с кнопкой плавающего действия.
Анимация кругового погрузчика с интеграцией
Поведение Развернуть и свернуть содержимоеСтрелка, указывающая вниз при сворачивании и вверх при раскрытии.

Поэтапная загрузка
Однофазные загрузки
Чернила (копии и изображения) загружаются в существующий неизменяемый контейнер.
Двухфазная загрузка
Создается бумажный контейнер, затем в него загружаются чернила (копия и изображения).
Загрузка контента в первый раз
Загружать и отображать все содержимое одновременно.
Загрузка дополнительного контента
Пример 1: Расширение карты
Неопределенный линейный индикатор рекомендуется для расширения карты на больших поверхностях, таких как рабочий стол.
Пример 2: прокрутите вверх, чтобы загрузить больше
Неопределенный круговой индикатор с начальной радиальной реакцией чернил рекомендуется при загрузке списка снизу.
Пример 3: проведите пальцем вниз, чтобы обновить
Неопределенный круговой индикатор с радиальной реакцией чернил рекомендуется при обновлении списка сверху.
Проверка макета Compose | Разработчики Android
Тестирование пользовательского интерфейса или экранов используется для проверки правильности поведения вашего
Создавайте код, улучшая качество своего приложения, обнаруживая ошибки на ранней стадии.
процесс развития.
Compose предоставляет набор тестовых API для поиска элементов и проверки их атрибутов. и выполнять действия пользователя. Они также включают расширенные функции, такие как время манипуляция.
Примечание. Тестирование пользовательского интерфейса, созданного с помощью Compose, отличается от тестирования интерфейса на основе View. Пользовательский интерфейс. Инструментарий пользовательского интерфейса на основе представления четко определяет, что представляет собой представление. является. Представление занимает прямоугольное пространство и имеет свойства, такие как идентификаторы, положение, поля, отступы и т. д. В Compose, только некоторые составные элементы создают пользовательский интерфейс в иерархии пользовательского интерфейса, поэтому необходим другой подход к сопоставлению элементов пользовательского интерфейса.Семантика
Тесты пользовательского интерфейса в Compose используют семантику для взаимодействия с иерархией пользовательского интерфейса.
Семантика, как следует из названия, придает смысл части пользовательского интерфейса. В данном контексте,
«часть пользовательского интерфейса» (или элемент) может означать что угодно, от одного компонуемого до полного
экран. 9Дерево семантики 0098 создается вместе с иерархией пользовательского интерфейса, и
описывает это.
Рис. 1. Типичная иерархия пользовательского интерфейса и ее семантическое дерево.
Структура семантики в основном используется для доступности, поэтому тесты преимущество информации, раскрываемой семантикой об иерархии пользовательского интерфейса. Разработчики решают, что и сколько выставлять.
Рис. 2. Типичная кнопка, содержащая значок и текст.
Например, для такой кнопки, состоящей из значка и текста
элемент, дерево семантики по умолчанию содержит только текстовую метку «Нравится». Это
потому что некоторые компонуемые, такие как Текст
, уже предоставляет некоторые свойства для
дерево семантики. Вы можете добавлять свойства в семантическое дерево, используя
Модификатор
.
Моя Кнопка( modifier = Modifier.semantics { contentDescription = "Добавить в избранное" } )Примечание: Дополнительные сведения о семантике Compose см. в разделе Семантика в Составьте руководство. Вы также можете прочитать больше о как свойства семантики используются для улучшения вашего приложения доступность.
Настройка
В этом разделе описывается, как настроить ваш модуль, чтобы вы могли тестировать составление кода.
Сначала добавьте следующие зависимости в файл build.gradle
модуля
содержащие ваши тесты пользовательского интерфейса:
// Правила тестирования и транзитивные зависимости: androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version") // Требуется для createAndroidComposeRule, но не для createComposeRule: debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
Этот модуль включает в себя ComposeTestRule
и реализацию для Android
позвонил AndroidComposeTestRule
. С помощью этого правила вы можете установить
или получить доступ к деятельности. Типичный тест пользовательского интерфейса для Compose выглядит так:
// файл: app/src/androidTest/java/com/package/MyComposeTest.kt класс MyComposeTest { @получить:Правило val composeTestRule = createComposeRule() // используйте createAndroidComposeRule(), если вам нужен доступ к // деятельность @Тест весело мой тест () { // Запускаем приложение composeTestRule.setContent { MyAppTheme { Основной Экран (uiState = fakeUiState, /*...*/) } } composeTestRule.onNodeWithText("Продолжить").performClick() composeTestRule.onNodeWithText("Добро пожаловать"). assertIsDisplayed() } }
Тестирование API
Существует три основных способа взаимодействия с элементами:
- Поисковики позволяют выбрать один или несколько элементов (или узлов в дерево семантики), чтобы делать утверждения или выполнять над ними действия.
- Утверждения используются для проверки того, что элементы существуют или имеют определенные атрибуты.
- Действия внедряют смоделированные пользовательские события в элементы, такие как клики или другие жесты.
Некоторые из этих API принимают
Сопоставление семантики
для ссылки на один или более узлов в семантическом дереве.
Искатели
Вы можете использовать на узле
и на всех узлах
чтобы выбрать один или несколько узлов соответственно,
но вы также можете использовать удобные средства поиска для наиболее распространенных запросов, таких как
на узле с текстом
, onNodeWithContentDescription
и т. д.
Вы можете просмотреть полный список в шпаргалке Compose Testing.
Выберите один узел
composeTestRule.onNode(<>, useUnmergedTree = false): SemanticsNodeInteraction
// Пример составитьTestRule .onNode(hasText("Кнопка")) // Эквивалент onNodeWithText("Кнопка")
Выберите несколько узлов
composeTestRule .onAllNodes(<>): SemanticsNodeInteractionCollection
// Пример составитьTestRule .onAllNodes(hasText("Кнопка")) // Эквивалент onAllNodesWithText("Кнопка")
Использование неслитного дерева
Некоторые узлы объединяют семантическую информацию своих потомков. Например, кнопка с двумя текстовыми элементами объединяет их метки:
MyButton { Текст("Здравствуйте") Текст("Мир") }
Из теста мы можем использовать printToLog()
для отображения семантического дерева:
composeTestRule.onRoot().printToLog("TAG")
Этот код выводит следующий вывод:
Node #1 at (...)px |-Узел #2 в (...)px Роль = «Кнопка» Текст = '[Привет, мир]' Действия = [OnClick, GetTextLayoutResult] MergeDescendants = «истина»
Если вам нужно сопоставить узел, который будет неслитным деревом , вы можете установить
useUnmergedTree от
до true
:
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
Этот код выводит следующий вывод:
Node #1 at (...)px |-Узел #2 в (...)px По клику = '...' MergeDescendants = «истина» |-Узел #3 в (...)px | Текст = '[Привет]' |-Узел № 5 в (83,0, 86,0, 191,0, 135,0) пикселей Текст = '[Мир]'
Параметр useUnmergedTree
доступен во всех средствах поиска. Например,
здесь он используется в поисковике onNodeWithText
.
составить теструле .onNodeWithText("Мир", useUnmergedTree = true).assertIsDisplayed()
Утверждения
Проверка утверждений путем вызова assert()
в SemanticsNodeInteraction
возвращаемый поисковиком с одним или несколькими совпадениями:
// Одиночное совпадение: составитьTestRule .onNode(сопоставитель) .assert(hasText("Кнопка")) // hasText является SemanticsMatcher // Несколько сопоставителей могут использовать и/или составитьTestRule .onNode(сопоставитель).assert(hasText("Кнопка") или hasText("Button2"))
Вы также можете использовать вспомогательные функции для наиболее распространенных утверждений, таких как
assertExists
, assertIsDisplayed
, assertTextEquals
и т. д. Вы можете просмотреть полный список в шпаргалке Compose Testing.
Существуют также функции для проверки утверждений для набора узлов:
// Проверка количества совпавших узлов составитьTestRule .onAllNodesWithContentDescription("Битл").assertCountEquals(4) // Хотя бы одно совпадение составитьTestRule .onAllNodesWithContentDescription("Битл").assertAny(hasTestTag("Ударник")) // Все они совпадают составитьTestRule .onAllNodesWithContentDescription("Битл").assertAll(hasClickAction())
Действия
Чтобы внедрить действие в узел, вызовите функцию execute…()
:
composeTestRule.onNode(...).performClick()Примечание: Вы не можете связать действия внутри функции выполнения. Вместо этого сделайте несколько
выполнить()
вызова. Вот несколько примеров действий:
executeClick(), выполнитьSemanticsAction(ключ), выполнитьKeyPress(keyEvent), выполнить жест { swipeLeft() }
Вы можете просмотреть полный список в
Составьте шпаргалку по тестированию.
Сопоставители
В этом разделе описаны некоторые сопоставители, доступные для тестирования вашего Compose. код.
Иерархические сопоставители
Иерархические сопоставители позволяют перемещаться вверх или вниз по дереву семантики и выполнять простое соответствие.
fun hasParent(сопоставитель: SemanticsMatcher): SemanticsMatcher весело hasAnySibling (сопоставитель: SemanticsMatcher): SemanticsMatcher весело hasAnyAncestor (сопоставитель: SemanticsMatcher): SemanticsMatcher весело hasAnyDescendant (сопоставитель: SemanticsMatcher): SemanticsMatcher
Вот несколько примеров использования этих сопоставителей:
composeTestRule.onNode(hasParent(hasText("Button"))) .assertIsDisplayed()
Селекторы
Альтернативным способом создания тестов является использование селекторов , которые могут сделать некоторые
тесты более читабельны.
composeTestRule.onNode(hasTestTag("Игроки")) .onChildren() .фильтр (hasClickAction()) .assertCountEquals(4) .onFirst() .assert(hasText("Джон"))
Вы можете просмотреть полный список в Составьте шпаргалку по тестированию.
Синхронизация
Составление тестов по умолчанию синхронизируется с вашим пользовательским интерфейсом. Когда вы звоните
утверждение или действие через ComposeTestRule
, тест будет синхронизирован
заранее, ожидая, пока дерево пользовательского интерфейса не будет простаивать.
Обычно никаких действий предпринимать не нужно. Тем не менее, есть некоторые крайние случаи вы должны знать о.
Когда тест синхронизируется, ваше приложение Compose опережает время с помощью
виртуальные часы. Это означает, что тесты Compose не выполняются в режиме реального времени, поэтому они могут пройти
Быстро настолько, насколько это возможно.
Однако, если вы не используете методы, синхронизирующие ваши тесты, произойдет перекомпоновка, и пользовательский интерфейс будет казаться приостановленным.
@Тест весело counterTest () { val myCounter = mutableStateOf(0) // Состояние, которое может вызвать рекомпозицию var lastSeenValue = 0 // Используется для отслеживания рекомпозиций composeTestRule.setContent { Текст (myCounter.value.toString()) lastSeenValue = myCounter.value } myCounter.value = 1 // Состояние меняется, но перекомпоновки нет // Сбой, потому что ничто не вызвало рекомпозицию assertTrue (lastSeenValue == 1) // Проходит, потому что утверждение запускает рекомпозицию composeTestRule.onNodeWithText("1").assertExists() }
Также важно отметить, что это требование относится только к Compose иерархии, а не к остальной части приложения.
Отключение автоматической синхронизации
При вызове утверждения или действия через правило ComposeTestRule
, например
assertExists()
, ваш тест синхронизируется с пользовательским интерфейсом Compose. В некоторых случаях
вы можете остановить эту синхронизацию и управлять часами самостоятельно. Для
например, вы можете контролировать время, чтобы делать точные скриншоты анимации в
точка, где пользовательский интерфейс все еще был бы занят. Чтобы отключить автоматическую синхронизацию,
установите свойство
autoAdvance
в mainClock
на false
:
composeTestRule.mainClock.autoAdvance = false
Обычно вы самостоятельно переводите время. Вы можете продвинуть ровно один
кадр с advanceTimeByFrame()
или на определенную продолжительность с
advanceTimeBy()
:
composeTestRule.mainClock.advanceTimeByFrame() composeTestRule.mainClock.advanceTimeBy (миллисекунды)Примечание:
MainTestClock
отвечает за управление всеми рекомпозициями,
анимации и жесты.
Бездействующие ресурсы
Compose может синхронизировать тесты и пользовательский интерфейс, чтобы каждое действие и утверждение выполняется в состоянии ожидания, ожидая или переводя часы по мере необходимости. Однако некоторые асинхронные операции, результаты которых влияют на состояние пользовательского интерфейса, могут выполняться в фон, в то время как тест не знает о них.
Вы можете создать и зарегистрировать эти ресурсов бездействия в своем тесте, чтобы они учитываются при принятии решения о том, занято ли тестируемое приложение или праздный. Вам не нужно предпринимать никаких действий, если вам не нужно регистрировать дополнительные бездействующие ресурсы, например, если вы запускаете фоновое задание, которое не синхронизировано с Espresso или Compose.
Этот API очень похож на Idling Espresso.
Ресурсы для указания, если
тестируемый объект бездействует или занят. Вы используете тестовое правило Compose для регистрации
осуществление
Ресурс холостого хода
.
composeTestRule.registerIdlingResource(idlingResource) composeTestRule.unregisterIdlingResource(idlingResource)
Ручная синхронизация
В некоторых случаях необходимо синхронизировать пользовательский интерфейс Compose с другими частями ваш тест или приложение, которое вы тестируете.
waitForIdle
ожидает, пока Compose будет бездействовать, но это зависит от autoAdvance
свойство:
composeTestRule.mainClock.autoAdvance = true // по умолчанию composeTestRule.waitForIdle() // переводит часы вперед до тех пор, пока Compose не станет бездействующим composeTestRule.mainClock.autoAdvance = ложь composeTestRule.waitForIdle() // Ждет только ожидания бездействующих ресурсов
Обратите внимание, что в обоих случаях waitForIdle
также будет ждать ожидания
проходы по чертежам и макетам.
Кроме того, вы можете переводить часы вперед до тех пор, пока не будет выполнено определенное условие с помощью
advanceTimeUntil()
.
composeTestRule.mainClock.advanceTimeUntil (timeoutMs) {условие}
Обратите внимание, что данное условие должно проверять состояние, на которое можно повлиять
по этим часам (работает только в состоянии Compose). Любое состояние, зависящее от
Измерение или рисование Android (то есть измерение или рисование вне Compose) должно
используйте более общую концепцию, такую как waitUntil()
:
composeTestRule.waitUntil(timeoutMs) {условие}Предупреждение: В некоторых случаях использование механизмов в тесте, таких как внешний
CountDownLatch
вместо waitUntil
API могли вести себя неожиданно,
так как тестовые часы не будут продвинуты.
Общие шаблоны
В этом разделе описаны некоторые распространенные подходы, которые вы встретите при тестировании Compose.
Изолированное тестирование
ComposeTestRule
позволяет
начать активность, отображающую любой компонуемый: ваше полное приложение, одно
экран или небольшой элемент. Также рекомендуется проверить, что ваши составные
правильно инкапсулированы и работают независимо, что позволяет упростить и
более целенаправленное тестирование пользовательского интерфейса.
Это не означает, что вы должны только создавать модульные тесты пользовательского интерфейса. Объем тестов пользовательского интерфейса большие части вашего пользовательского интерфейса также очень важны.
Доступ к действиям и ресурсам после настройки собственного содержимого
Часто вам необходимо установить тестируемое содержимое с помощью
composeTestRule.
и вам также необходимо получить доступ к ресурсам деятельности,
например, чтобы утверждать, что отображаемый текст соответствует строковому ресурсу. Однако,
вы не можете вызывать setContent
setContent
для правила, созданного с помощью
createAndroidComposeRule()
, если действие уже вызывает его.
Распространенным шаблоном для достижения этого является создание AndroidComposeTestRule
с использованием
пустая деятельность
(например, ComponentActivity
).
класс MyComposeTest { @получить:Правило val composeTestRule = createAndroidComposeRule() @Тест весело мой тест () { // Запускаем приложение composeTestRule.setContent { MyAppTheme { Главный Экран (uiState = примерUiState, /*...*/) } } val continueLabel = composeTestRule. activity.getString(R.string.next) composeTestRule.onNodeWithText(continueLabel).performClick() } }
Обратите внимание, что ComponentActivity
необходимо добавить в
Файл AndroidManifest.xml
. Вы можете сделать это, добавив эту зависимость в свой
модуль:
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
Пользовательские свойства семантики
Вы можете создавать настраиваемые свойства семантики для предоставления информации тестам. Делать
это, определите новый SemanticsPropertyKey
и сделайте его доступным с помощью
Семантикспропертиресивер
.
// Создает свойство семантики логического типа val PickedDateKey = SemanticsPropertyKey("PickedDate") var SemanticsPropertyReceiver. pickedDate от PickedDateKey
Теперь вы можете использовать это свойство, используя модификатор семантики
:
val datePickerValue, запомнив { mutableStateOf(0L) } MyCustomDatePicker( modifier = Modifier.semantics { PickDate = datePickerValue } )
Из тестов можно использовать SemanticsMatcher.expectValue
, чтобы подтвердить значение
свойство:
composeTestRule .onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21 .assertExists()Предупреждение: Пользовательские свойства семантики следует использовать только в том случае, если их трудно сопоставить конкретный элемент, используя заданные средства поиска и сопоставления. Использование пользовательской семантики свойства для отображения визуальных свойств, таких как цвета, размер шрифта или округление угловой радиус не рекомендуется, так как он может загрязнить производственный код и неправильно реализации могут привести к ошибкам, которые трудно найти.

Проверка восстановления состояния
Вы должны убедиться, что состояние ваших элементов Compose правильно восстановлено
при воссоздании действия или процесса. Можно выполнить такую проверку
не полагаясь на активный отдых с
StateRestorationTester
сорт.
Этот класс позволяет имитировать воссоздание составного объекта. Его
особенно полезно для проверки реализации
запомнитьСохраняемый
.
класс MyStateRestorationTests { @получить:Правило val composeTestRule = createComposeRule() @Тест весело onRecreation_stateIsRestored () { val restoreTester = StateRestorationTester(composeTestRule) restoreTester.setContent {MainScreen()} // TODO: выполнить действия, изменяющие состояние // Запустить воссоздание restoreTester.emulateSavedInstanceStateRestore() // TODO: Убедитесь, что состояние было правильно восстановлено.} }
Отладка
Основной способ решения проблем в тестах — просмотр дерева семантики.
Вы можете распечатать дерево, вызвав composeTestRule.onRoot().printToLog()
в
любой момент в вашем тесте. Эта функция печатает журнал следующим образом:
Node #1 at (...)px |-Узел #2 в (...)px По клику = '...' MergeDescendants = «истина» |-Узел #3 в (...)px | Текст = 'Привет' |-Узел № 5 в (83,0, 86,0, 191,0, 135,0) пикселей Текст = "Там"
Эти журналы содержат ценную информацию для отслеживания ошибок.
Взаимодействие с Espresso
В гибридном приложении вы можете найти компоненты Compose внутри иерархий представлений и
представления внутри составных компонентов Compose (через компонуемый компонент AndroidView
).
Для соответствия любому типу не требуется никаких специальных шагов. Вы сопоставляете просмотры через
Espresso
onView
и элементы Compose через ComposeTestRule
.
@Тест весело androidViewInteropTest () { // Проверяем начальное состояние TextView, которое зависит от состояния Compose: Espresso.onView(withText("Hello Views")).check(matches(isDisplayed())) // Щелкаем по кнопке Compose, которая меняет состояние composeTestRule.onNodeWithText("Нажмите здесь").performClick() // Проверяем новое значение Espresso.onView(withText("Hello Compose")).check(matches(isDisplayed())) }
Взаимодействие с UiAutomator
По умолчанию составные объекты доступны из
UiAutomator только своими
удобные дескрипторы (отображаемый текст, описание контента и т.д.). Если ты хочешь
чтобы получить доступ к любому составному объекту, который использует Modifier.
, вам необходимо включить
семантическое свойство testTag
testTagAsResourceId
для конкретного составного поддерева.
Включение этого поведения полезно для составных объектов, у которых нет других
уникальный дескриптор, такой как составные элементы с возможностью прокрутки (например, LazyColumn
).
Вы можете включить его только один раз выше в иерархии составных объектов, чтобы гарантировать, что все
вложенные составные объекты с Modifier.testTag
доступны из UiAutomator.
Леса( // Включает все составные элементы в иерархии. модификатор = Модификатор.семантика { testTagsAsResourceId = истина } ){ // Modifier.testTag доступен из UiAutomator для компоновок, вложенных сюда. Ленивая колонка( модификатор = Modifier.![]()