Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Screenshot tests edited #564

Merged
merged 50 commits into from
Oct 9, 2023
Merged
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
4a390ca
TECH: add screenshot-tests-1 lesson
sumin93 Jun 2, 2023
2a80524
TECH: update tutorial branch
sumin93 Jun 2, 2023
2e78bea
TECH: update tutorial
sumin93 Jun 2, 2023
1d138ab
TECH: update tutorial
sumin93 Jun 2, 2023
67973e5
TECH: update tutorial
sumin93 Jun 2, 2023
94ddc13
TECH: update tutorial
sumin93 Jun 2, 2023
7b3cfd0
TECH: update tutorial
sumin93 Jun 2, 2023
0714a5d
TECH: change build branch
sumin93 Jun 27, 2023
06140bd
TECH: minor changes to review lessons logger and screenshots
sumin93 Jun 28, 2023
f8cf670
TECH: minor changes to review lessons logger and screenshots
sumin93 Jun 28, 2023
42cb800
TECH: minor changes to review lessons logger and screenshots
sumin93 Jun 28, 2023
c51c942
TECH: changes in screenshot lesson
sumin93 Jul 5, 2023
37b379f
TECH: changes in screenshot lesson
sumin93 Jul 5, 2023
57a2489
TECH: changes in screenshot lesson
sumin93 Jul 5, 2023
645d693
TECH: changes in screenshot lesson
sumin93 Jul 5, 2023
3077619
TECH: changes in screenshot lesson
sumin93 Jul 6, 2023
3c7e92f
TECH: changes in screenshot lesson
sumin93 Jul 10, 2023
cdd0bf8
TECH: changes in screenshot lesson
sumin93 Jul 10, 2023
57c0b79
TECH: changes in screenshot lesson
sumin93 Jul 10, 2023
cc7f049
TECH: changes in screenshot lesson
sumin93 Jul 10, 2023
8d64661
TECH: changes in screenshot lesson
sumin93 Jul 13, 2023
1901405
TECH: changes in screenshot lesson
sumin93 Jul 13, 2023
8933ea8
TECH: changes in screenshot lesson
sumin93 Jul 13, 2023
429d1d8
TECH: changes in screenshot lesson
sumin93 Jul 13, 2023
b11a760
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
5076144
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
eb7712a
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
c3b577d
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
f86684a
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
a745a8d
TECH: screenshot tests lesson
sumin93 Jul 18, 2023
913f327
TECH: screenshot tests lesson
sumin93 Jul 24, 2023
20bd02e
TECH: screenshot tests lesson
sumin93 Aug 14, 2023
64b6b59
TECH: screenshot tests lesson
sumin93 Aug 14, 2023
f6d5f91
TECH: screenshot tests lesson
sumin93 Aug 14, 2023
5e52cbd
TECH: screenshot tests lesson
sumin93 Aug 14, 2023
341c50b
Update tutorial.yml
AzamatCherchesov Aug 21, 2023
8847379
TECH: change english version
sumin93 Aug 24, 2023
2706c49
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
3240712
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
28ef60a
Revert "TECH: edit Screenshot_tests_2.en.md"
sumin93 Aug 31, 2023
33308aa
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
f6fdfda
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
f30bf30
Revert "TECH: edit Screenshot_tests_2.en.md"
sumin93 Aug 31, 2023
95a1e52
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
1c07e06
TECH: edit Screenshot_tests_2.en.md
sumin93 Aug 31, 2023
bb9ffac
TECH: fix english version
sumin93 Aug 31, 2023
7237223
TECH: fix english version
sumin93 Aug 31, 2023
857f20a
TECH: return build on master branch
sumin93 Aug 31, 2023
d679579
Merge branch 'master' into TECH-tutorial
AzamatCherchesov Oct 9, 2023
f1e74b4
TECH: rolled back some changes
AzamatCherchesov Oct 9, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tutorial.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ jobs:
with:
python-version: 3.x
- run: pip install mkdocs-material
- run: pip install mkdocs-static-i18n
- run: pip install mkdocs-static-i18n==0.56
- run: mkdocs gh-deploy --force
73 changes: 25 additions & 48 deletions docs/Tutorial/Screenshot_tests_1.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

## Продвинутый уровень
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а почему в en русский текст?


Для успешного прохождения предыдущих уроков было достаточно базовых навыков программирования на Kotlin, знания Android разработки при этом не требовались, и успешно пройти все уроки могли как разработчики, так и тестировщики. Но для нашей сегодняшней темы, а также всех последующих, нужно понимание того, как разрабатываются приложения, чем отличаются архитектурные шаблоны MVVM и MVP, как применять Dependency Injection и другое.
Ранее для успешного прохождения уроков было достаточно базовых навыков программирования на Kotlin, знания Android-разработки не требовались. Однако сегодня мы начинаем углубленное изучение фреймворка Kaspresso, и для последующих тем потребуется более глубокое понимание устройства приложений, архитектурного шаблона MVVM, применения Dependency Injection и других концепций.

Поэтому предполагается, что все дальнейшие действия (или бОльшая их часть), которые мы будем проходить в курсе, находятся в зоне ответственности разработчиков, и эти уроки ориентированы на них. Если же с Android разработкой вы не знакомы, то можете все равно проходить эти уроки, чтобы иметь представление о возможностях Kaspresso, но учитывайте тот факт, что часть материала может быть непонятной.
Если у вас возникают трудности с пониманием этих тем, вы все равно можете приступить к прохождению уроков, чтобы иметь представление о возможностях Kaspresso. Однако имейте в виду, что часть материала может быть непонятной на данном этапе.

## Тестирование LoginActivity на разных локалях

Expand All @@ -32,13 +32,19 @@

Возникшую проблему могут решить скриншот-тесты. Их суть заключается в том, что для всех экранов, где пользователю отображаются строки, создаются так называемые «скриншотилки» – классы, которые делают скриншоты экрана во всех необходимых состояниях и для всех поддерживаемых языков.

После выполнения таких тестов скриншоты складываются в определенные папки. Тогда люди, ответственные за переводы и строки, смогут просмотреть снимки и убедиться, что для всех локалей и для всех состояний используются корректные значения.
После выполнения таких тестов скриншоты складываются в определенные папки. Затем их можно посмотреть и убедиться, что для всех локалей и для всех состояний используются корректные значения.

Screenshot-тесты будут отличаться от тестов, которые мы писали ранее:
Для создания screenshot-тестов можно воспользоваться уже написанными ранее тестами, внеся в них несколько изменений. В таком случае будут выполняться те же проверки, что и раньше, но также добавится сохранение скриншотов на определенных этапах. Так можно сделать, но это не считается хорошей практикой.

Во-первых, нас интересуют только строки на определенном экране, поэтому нет необходимости проходить весь процесс от старта приложения до открытия нужного экрана. Вместо этого, в тесте мы сразу будем открывать [Activity]( https://developer.android.com/reference/android/app/Activity) или [Fragment]( https://developer.android.com/guide/fragments), скриншоты которого хотим получить.
Дело в том, что screenshot-тесты предназначены для того, чтобы предоставить снимки определенного экрана во всех возможных состояниях и для всех локалей. В некоторых случаях получение всех возможных состояний экрана может занять длительное время.

Во-вторых, мы хотим получить снимки всех возможных состояний экрана для каждой локали, поэтому добавлять проверки элементов или выполнять шаги, имитирующие действия пользователя, как мы делали ранее, мы не будем. Наша цель –
К примеру, вам нужно узнать, как будет выглядеть экран, если пользователь только что прошел процесс регистрации. Тогда, для того чтобы получить снимок экрана, вам придется проходить регистрацию заново, причем делать это для каждой локали. Тогда один прогон теста может занять несколько минут вместо двух-трех секунд.

По этой причине screenshot-тесты обычно делают максимально "легковесными":

Во-первых, вместо того, чтобы проходить весь процесс от старта приложения до открытия нужного экрана, мы сразу будем открывать [Activity]( https://developer.android.com/reference/android/app/Activity) или [Fragment]( https://developer.android.com/guide/fragments), скриншоты которого хотим получить.

Во-вторых, мы не будем добавлять проверки элементов или выполнять шаги, имитирующие действия пользователя, как мы делали ранее. Наши цели –

<ol>
<li>Открыть экран</li>
Expand All @@ -49,7 +55,7 @@ Screenshot-тесты будут отличаться от тестов, кот

Дальше нужно поменять локаль и повторить все перечисленные действия.

Подробнее про состояния (или стейты, как их часто называют), и как их правильно устанавливать, мы поговорим позже, а сейчас напишем простой screenshot-тест, который откроет экран LoginActivity, сделает скриншот, затем сменит язык на устройстве на французский и снова сделает скриншот.
Подробнее про состояния (или стейты, как их часто называют), и как их правильно устанавливать, мы поговорим в следующем уроке, а сейчас напишем простой screenshot-тест, который откроет экран LoginActivity, сделает скриншот, затем сменит язык на устройстве на французский и снова сделает скриншот.

## Простой screenshot-тест

Expand Down Expand Up @@ -122,15 +128,15 @@ class LoginActivityScreenshots : DocLocScreenshotTestCase(locales = "en, fr") {

@Test
fun takeScreenshots() = run {
step("Take screenshots initial state") {
step("Take initial state screenshots") {

}
}
}

```

Для того чтобы сделать скриншоты, и чтобы эти скриншоты были сохранены в правильные папки на устройстве, необходимо вызвать метод `captureScreenshot`. В качестве параметра методу необходимо передать название файла, это может быть любая строка – по этому имени вы сможете найти скриншот на устройстве.
Чтобы сделать скриншоты и сохранить их в правильные папки на устройстве, необходимо вызвать метод `captureScreenshot`. В качестве параметра методу необходимо передать название файла, это может быть любая строка – по этому имени вы сможете найти скриншот на устройстве.

```kotlin
package com.kaspersky.kaspresso.tutorial.screenshot_tests
Expand All @@ -148,48 +154,19 @@ class LoginActivityScreenshots : DocLocScreenshotTestCase(locales = "en, fr") {

@Test
fun takeScreenshots() = run {
step("Take screenshots initial state") {
step("Take initial state screenshots") {
captureScreenshot("Initial state")
}
}
}

```

Разрешение на доступ к файлам здесь давать не нужно, это реализовано «под капотом». На данном этапе мы сделали все, что нужно, чтобы получить скриншоты экрана и посмотреть, как выглядит приложение на разных локалях, но желательно сделать еще одно изменение.
Разрешение на доступ к файлам здесь давать не нужно, это реализовано «под капотом». На данном этапе мы сделали все необходимое, чтобы получить скриншоты экрана и посмотреть, как выглядит приложение на разных локалях, но желательно сделать еще одно изменение.

Сейчас у нас открывается нужный экран, и сразу делается скриншот, поэтому есть вероятность, что какие-то данные на экране не успеют загрузиться, и снимок будет сделан до того, как мы увидим нужные нам элементы.

Чтобы решить эту проблему, давайте в Page Object `Login Screen` мы добавим метод, который дождется загрузки всех необходимых элементов интерфейса. В этом методе мы просто для всех объектов сделаем проверку на `isVisible`. Это проверка в своей реализации использует `flakySafely`, поэтому даже если данные мгновенно загружены не будут, то тест будет ждать, пока условие не выполнится в течение нескольких секунд.

Добавляем метод, назовем его `waitForScreen`:

```kotlin
package com.kaspersky.kaspresso.tutorial.screen

import com.kaspersky.kaspresso.screens.KScreen
import com.kaspersky.kaspresso.tutorial.R
import io.github.kakaocup.kakao.edit.KEditText
import io.github.kakaocup.kakao.text.KButton

object LoginScreen : KScreen<LoginScreen>() {

override val layoutId: Int? = null
override val viewClass: Class<*>? = null

val inputUsername = KEditText { withId(R.id.input_username) }
val inputPassword = KEditText { withId(R.id.input_password) }
val loginButton = KButton { withId(R.id.login_btn) }

fun waitForScreen() {
inputUsername.isVisible()
inputPassword.isVisible()
loginButton.isVisible()
}
}

```
В тестовом классе можем вызвать этот метод перед тем, как сделать скриншот:
Чтобы решить эту проблему, перед тем, как делать скриншот, мы дождемся загрузки всех необходимых элементов интерфейса. Для всех объектов `LoginScreen` мы сделаем проверку на `isVisible`. Это проверка в своей реализации использует `flakySafely`, поэтому даже если данные мгновенно загружены не будут, то тест будет ждать, пока условие не выполнится в течение нескольких секунд.

```kotlin
package com.kaspersky.kaspresso.tutorial.screenshot_tests
Expand All @@ -208,26 +185,27 @@ class LoginActivityScreenshots : DocLocScreenshotTestCase(locales = "en, fr") {

@Test
fun takeScreenshots() = run {
step("Take screenshots initial state") {
step("Take initial state screenshots") {
LoginScreen {
waitForScreen()
inputUsername.isVisible()
inputPassword.isVisible()
loginButton.isVisible()
captureScreenshot("Initial state")
}
}
}
}
```

Запускаем тест. Тест пройден успешно, и в `Device File Explorer` в папке `sdcard/Documents/screenshots` вы сможете найти все скриншоты, при этом для каждой локали была создана своя папка и вы сможете просмотреть, как выглядит ваше приложение на разных языках.
Запускаем тест. Тест пройден успешно. В `Device File Explorer` в папке `sdcard/Documents/screenshots` вы сможете найти все скриншоты, при этом для каждой локали была создана своя папка, и вы сможете просмотреть, как выглядит ваше приложение на разных языках.

<img src="../images/screenshot_tests_1/screenshot_test.png" alt="Screenshot test results"/>

<img src="../images/screenshot_tests_1/initial_en.png" alt="Initial state en" width="300"/>

<img src="../images/screenshot_tests_1/initial_fr.png" alt="Initial state fr" width="300"/>


Теперь, просмотрев скриншоты, можно увидеть проблему в приложении, что не все строки были добавлены корректно, и разработчик может исправить ошибку, добавив необходимые значения в файл `values-fr/strings.xml`.
Теперь, просмотрев скриншоты, можно увидеть проблему в приложении из-за отсутствия необходимых переводов строк и исправить ошибку, добавив необходимые значения в файл `values-fr/strings.xml`.

!!! info
Возможно, на некоторых устройствах при смене локали у вас возникнет проблема с заголовком экрана – весь контент на экране будет корректно переведен на необходимый язык, а заголовок останется прежним. Проблема связана с [багом в библиотеке Google]( https://issuetracker.google.com/issues/246092030). Его уже пофиксили, как только опубликуют соответствующий релиз, внесем изменения в Kaspresso.
Expand All @@ -237,7 +215,6 @@ class LoginActivityScreenshots : DocLocScreenshotTestCase(locales = "en, fr") {

В данном уроке мы рассмотрели: зачем нужны скриншот-тесты, как их писать и где смотреть результаты выполнения тестов.

Тема screenshot-тестов довольно обширная, и для более комфортного освоения мы ее разбили на несколько частей. Для более углубленного изучения переходите к следующему уроку

Тема screenshot-тестов довольно обширная, и для более комфортного освоения мы ее разбили на несколько частей. В следующем уроке мы более подробно разберем тему стейтов, как их правильно устанавливать, и что нужно учитывать при разработке приложения, чтобы его можно было покрыть тестами.


Loading
Loading