Расширенное веб-автоматическое тестирование 05 ———Тестирование сценариев взаимодействия интерфейсов
Расширенное веб-автоматическое тестирование 05 ———Тестирование сценариев взаимодействия интерфейсов

1. Цель

Взаимодействие с интерфейсом, являющееся важной частью контента тестирования «черного ящика», стало почти первым контактным контентом среди обширной группы тестировщиков. При выполнении задач тестирования каждому тестировщику необходимо стоять с точки зрения клиента. Основные условия были соблюдены. и моделирования ежедневных бизнес-операций клиентов, взаимодействие с интерфейсом стало главным приоритетом. Аналогично, как мы можем лучше интегрировать операции взаимодействия интерфейса в реальный код и структуру автоматизированного тестирования? Сегодня блоггер предложит вам взглянуть на некоторые передовые методы проектирования взаимодействия с интерфейсом.

2. Функция

 Так в чем конкретное практическое значение взаимодействия интерфейсов при автоматизированном тестировании? Во-первых, с точки зрения бизнеса, чтобы приблизиться к повседневному деловому поведению реальных пользователей, тестировщики должны разработать серию соответствующих операций взаимодействия с интерфейсом, поскольку сложное тестирование взаимодействия будет включать в себя сложные взаимодействия между несколькими элементами и изменениями статуса страницы. ближе к реальной работе реальных пользователей с тестируемым веб-объектом. По сравнению с незапланированными случайными операциями конкретные интерактивные операции интерфейса могут эффективно моделировать реальные сценарии использования пользователя, тем самым более полно проверяя функции приложения и взаимодействие с пользователем. Это соответствует тому, что как только будет сформирован четкий план работы взаимодействия интерфейса, тестовое покрытие функционального модуля, естественно, будет улучшено. Знакомое нам интерфейсное взаимодействие, помимо работы некоторых компонентов, Динамический контент, асинхронный. запросы, переходы по страницам, взаимодействие со всплывающими окнами и т. д. также часто задействованы. Благодаря пересечению и комбинации этих элементов тестировщики могут обнаружить больше потенциальных проблем, тем самым улучшая покрытие тестами.

Кроме того, помимо базового взаимодействия интерфейса, обмен данными (логическая обработка front-end и back-end) также может быть проверен путем проверки взаимодействия интерфейса. Конечно, это требует предварительного эффективного интерактивного планирования операций в качестве предварительного условия. Например, с помощью отправки данных в форме и фоновой обработки данных вы можете проверить, правильно ли передаются внешние и внутренние данные. Я считаю, что каждый должен быть знаком с этим сценарием. Итак, как эффективно организовать и объединить различные отправки форм. Проверка данных стала вопросом о том, является ли один из основных факторов успешного выполнения этого типа сценария тестирования.

3. Практика

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

3.1 Введение и разделение сцены

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

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

  • Пользователь входит в учетную запись финансовой системы.
  • Перейдите на страницу заявки на кредит.
  • Заполните личную информацию, включая имя, идентификационный номер, номер мобильного телефона и т. д., и выполните проверку формата.
  • Выберите тип кредитного продукта, например, потребительский кредит, ипотечный кредит на автомобиль и т. д.
  • Введите сумму кредита и проверьте диапазон сумм.
  • Выберите период погашения, например 12 месяцев, 24 месяца и т. д., и проверьте соответствие срока погашения кредитному продукту.
  • Загрузите необходимую информацию, такую ​​как сканированные копии удостоверений личности, квитанции об оплате и т. д., и проверьте формат и размер загружаемых файлов.
  • Система рассчитывает лимит, отображает план погашения и сравнивает его с ожидаемыми результатами.
  • Обработайте напоминания о рисках, таких как риски погашения, условия кредита и т. д., подтвердите и согласитесь.
  • Подать заявку на кредит.
  • Проверьте статус заявки на кредит, чтобы обеспечить успешное применение.

Соответствующие ожидаемые результаты

  • Пользователь может успешно войти в учетную запись и Перейти. на страницу заявки на кредит.
  • Персональная информация и информация о кредите, заполненная пользователем, соответствуют требованиям по формату и объему.
  • Расчет суммы кредита и представление плана погашения соответствуют ожидаемым результатам.
  • Пользователь успешно отправляет заявку на кредит и может просматривать статус заявки.

3.2 Конструкция таблицы GWT

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

Сценарий: Пользователь подает заявку на получение обычного кредита. Описание сцены: Как заявитель на получение кредита, пользователь надеется успешно подать заявку на получение кредита, тем самым начиная ряд шагов, необходимых для подачи заявки. Given: Пользователь уже вошел в свой финансовый счет Пользователь не зарегистрировал соответствующую информацию (имя, идентификационный номер, номер мобильного телефона) Вся аутентификационная информация, принадлежащая пользователю, действительна, и регистрация прошла успешно. When: Пользователь заходит на страницу заявки на кредит Пользователь заполняет форму, указывая действительную личную информацию. Пользователь выбирает тип кредитного продукта Пользователь вводит сумму кредита, которая попадает в допустимый диапазон. Пользователь выбирает эффективный период погашения Пользователь загружает необходимые файлы Then: Субъект должен рассчитать сумму кредита и представить план погашения. Пользователь просматривает и принимает условия кредита Пользователь отправляет заявку на кредит Пользователь должен видеть статус своей заявки на кредит как успешный.

3.3 Разработка кода

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

Как и в большинстве сред автоматизированного тестирования пользовательского интерфейса, мы можем разделить бизнес-часть, которую необходимо протестировать, на три части: base, page_objects и test_loan_application соответствуют трем скриптам Python соответственно. когда page_objects увидит имя, вы узнаете, что мы инкапсулируем элементы страницы на основе режима PO, и test_loan_application, конечно же, является нашим тестовым примером.

Без лишних слов, давайте сначала разработаем базовый скрипт:

Язык кода:javascript
копировать
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self, driver):
        self.driver = driver

    def wait_for_element_to_be_visible(self, by, locator, timeout=10):
        wait = WebDriverWait(self.driver, timeout)
        return wait.until(EC.visibility_of_element_located((by, locator)))

class BaseTest:
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.implicitly_wait(5)
        cls.driver.maximize_window()

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

О базовом скрипте особо нечего сказать. Это рутинная операция. Необходимо пояснить, что в базу добавлено явное ожидание, соответствующее асинхронному обмену данными. У всех разные мнения, и они могут свободно использовать его. Далее идет page_objects. Все видимые объекты (тестовые объекты) на странице, включая некоторые общие компоненты (кнопки, раскрывающиеся списки и т. д.), инкапсулируются в них для облегчения повторного использования в последующих тестовых случаях.

Язык кода:javascript
копировать
from selenium.webdriver.common.by import By
from base import BasePage

class LoginPage(BasePage):
    def __init__(self, driver):
        super().__init__(driver)
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.ID, "login_button")

    def login(self, username, password):
        self.driver.get("https://example-bank.com/login")
        self.driver.find_element(*self.username_input).send_keys(username)
        self.driver.find_element(*self.password_input).send_keys(password)
        self.driver.find_element(*self.login_button).click()

class LoanApplicationPage(BasePage):
    def __init__(self, driver):
        super().__init__(driver)
        self.product_type_dropdown = (By.ID, "product_type")
        self.loan_amount_input = (By.ID, "loan_amount")
        self.repayment_period_dropdown = (By.ID, "repayment_period")
        self.upload_file_input = (By.ID, "upload_file")
        self.submit_button = (By.ID, "submit_button")

    def apply_for_loan(self, product_type, loan_amount, repayment_period, file_path):
        self.driver.get("https://example-bank.com/loan_application")
        self.driver.find_element(*self.product_type_dropdown).send_keys(product_type)
        self.driver.find_element(*self.loan_amount_input).send_keys(loan_amount)
        self.driver.find_element(*self.repayment_period_dropdown).send_keys(repayment_period)
        self.driver.find_element(*self.upload_file_input).send_keys(file_path)
        self.driver.find_element(*self.submit_button).click()

    def click_calculate_button(self):
        calculate_button = self.wait_for_element_to_be_visible(By.ID, "calculate_button")
        calculate_button.click()

    def select_repayment_period(self, period):
        repayment_period_dropdown = self.wait_for_element_to_be_visible(By.ID, "repayment_period")
        select = Select(repayment_period_dropdown)
        select.select_by_visible_text(period)

    def accept_risk_warning(self):
        accept_button = self.wait_for_element_to_be_visible(By.ID, "accept_button")
        accept_button.click()

	def risk_assessment(self):
		assessment_button = self.wait_for_element_to_be_visible(By.ID, "assessment_button")
		assessment_button.click()

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

Язык кода:javascript
копировать
import unittest
from base import BaseTest
from page_objects import LoginPage, LoanApplicationPage

class TestLoanApplication(BaseTest):
    def test_loan_application(self):
        login_page = LoginPage(self.driver)
        login_page.login("testuser", "testpass")

        loan_application_page = LoanApplicationPage(self.driver)
        loan_application_page.apply_for_loan("Personal Loan", "5000", "12 months", "path/to/uploaded/file.pdf")

        # Добавьте асинхронную связь и явное ожидание отображения и проверки статуса заявки на кредит.
        loan_application_page.wait_for_element_to_be_visible(By.ID, "loan_application_status", timeout=20)
        status = self.driver.find_element(By.ID, "loan_application_status").text
        assert "Successful" in status, «Ошибка статуса заявки на кредит»

        # Расчет суммы теста и отображение плана погашения
        loan_amount = "5000"
        repayment_period = "12 months"
        expected_loan_amount = "5000"
        expected_repayment_plan = "Monthly Installments: 12\nAmount per Installment: 416.67"
        loan_application_page.fill_loan_amount_and_repayment_period(loan_amount, repayment_period)
        loan_application_page.click_calculate_button()
        loan_application_page.wait_for_element_to_be_visible(By.ID, "calculated_loan_amount", timeout=10)
        calculated_loan_amount = self.driver.find_element(By.ID, "calculated_loan_amount").text
        assert calculated_loan_amount == expected_loan_amount, «Ошибка расчета суммы»
        repayment_plan = self.driver.find_element(By.ID, "repayment_plan").text
        assert repayment_plan == expected_repayment_plan, «Ошибка отображения плана погашения»

        # Советы по управлению рисками
        risk_warning = loan_application_page.get_risk_warning_text()
        if risk_warning:
            loan_application_page.accept_risk_warning()
        else:
            # Если предупреждение о риске отсутствует, проведите оценку инвестиционного риска.
            loan_application_page.risk_assessment()

        # Выберите период погашения
        new_repayment_period = "24 months"
        loan_application_page.select_repayment_period(new_repayment_period)

        # Подать заявку на кредит
        loan_application_page.submit_loan_application()
        loan_application_page.wait_for_element_to_be_visible(By.ID, "loan_application_status", timeout=20)
        status = self.driver.find_element(By.ID, "loan_application_status").text
        assert "Successful" in status, «Ошибка статуса заявки на кредит»

if __name__ == "__main__":
    unittest.main()

4. Послесловие

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose