Если вы начинающий специалист в автоматизации тестирования, или автотестировщик с опытом, готовый обсуждать и улучшать стратегии тестирования, то с радостью представляю вам первый пост в серии, посвященный разборам подходов к тестированию ПО. Здесь я разбираю свой взгляд на способы решения реальных задач по тестированию, используя Playwright + TypeScript.
📝🔍 Как отсортировать данные в Typescript и как это поможет протестировать сортировку в вашем веб приложении
Для того, чтобы отсортировать массив данных, в Typescript есть метод .sort(), а так же .sort().reverse() который сверяет значения массива между собой и выстраивает их по возрастанию или убыванию. В подробности мы не углубляемся, сейчас это не имеет никакого значения.
Соответственно, мы можем сделать следующее:
import test, { expect } from '@playwright/test' test(`Sorting test`, async ({ page }) => { // Open page with table await page.goto(`/table`) // Find locator of 2nd column header const headerLocator = page.locator(`//th[2]`) // Find locator of all 2nd table column cells const cellsLocator = page.locator(`//tbody//tr/td[2]`) // Sort column await headerLocator.click() // Get text from each cell in 2nd column const data = await cellsLocator.allTextContents() // Make sure that parsed data and sorted data are equal expect(data).toEqual([...data].sort()) })
Готово, дело закрыто?
🤔💡❓Но в чем же заключается сложность, при решении реальной задачи?
Дело в том, что в реальном приложении, тип данных может отличаться от стандартных, часто используется нетипичные форматы(например цена, или дата), или в кастомные типы данных. Поэтому, при использовании этого подхода, мы столкнемся с тем, что для каждого столбца с данными, придется писать отдельные тест кейсы, передавая в .sort() функцию для сравнения значений.
Далее предлагаю рассмотреть мою тест спеку sortable-table.spec.ts
import { test } from '../src/fixtures' import { SORTABLE_TABLE_COLUMNS } from '../src/pages/sorting-demo/sorting-demo.columns' test.describe('Sortable table', () => { for (const column of Object.values(SORTABLE_TABLE_COLUMNS)) { test(`${column} sort ascending`, async ({ sortableTablePage }) => { const table = sortableTablePage.table await table.sort.validateNone(column) await table.sort.apply(column) await table.sort.validateAscending(column) }) test(`${column} sort descending`, async ({ sortableTablePage }) => { const table = sortableTablePage.table await table.sort.validateNone(column) await table.sort.apply(column, { clickCount: 2}) await table.sort.validateDescending(column) }) } })
🔧📊💻 Разбор: как это работает?
В данной тест спеке представлены два параметризованных теста ${column} sort ascending и ${column} sort descending . Имея всего два теста, мы проверяем сортировку по возрастанию и убыванию во всей таблице.
sortableTablePage — фикстура, которая открывает веб страницу и ждёт, что страница успешно загружена.
Что мы используем в качестве параметра? SORTABLE_TABLE_COLUMNS — статичный объект содержащий информацию о столбцах нашей таблицы: название столбца, формат данных.
На примере DateFormat — можем увидеть, что в классе формата, представлен метод сравнения данных, а так же метод по парсингу string->target format .
Это позволяет нам иметь единый метод для проверки тестирования:
async validate( column: TableColumn, direction: SortingDirection ): Promise<void> { await test.step( `Validate table column "${column}" is sorted in "${direction}" direction`, async () => { await expect( this.locators.headerByColumn(column) ).toHaveAttribute('aria-sort', direction) if (direction !== 'none') { const values = await this.getColumnValues(column) expect( new Set(values).size, `To have at least 2 unique values` ).toBeGreaterThanOrEqual(2) for (let i = 1; i < values.length; i++) { await test.step(`Compare row #${i} and #${i + 1}`, async () => { const value = values[i - 1] const nextValue = values[i] const result = await test.step(`Parse and compare values`, () => { return column.format.comparator(value, nextValue) }) switch (direction) { case 'ascending': expect.soft( result, `#${i} ${value} to be less than or equal #${ i + 1 } ${nextValue}` ).toBeLessThanOrEqual(0) break case 'descending': expect.soft( result, `#${i} ${value} to be greater than or equal #${ i + 1 } ${nextValue}` ).toBeGreaterThanOrEqual(0) break default: throw new Error(`Unknown sorting direction: ${String(direction)}`) } }) } } }) }
Как результат, мы имеем единый подход к тестированию, избегаем дублирования кода тестов, а так же имеет упрощенный способ для поддержки наших тестов.

📢 Что дальше?
Это только первый шаг, новые посты данной серии, с новыми примерами тестирования уже на подходе.
💬 Напишите в комментариях что вы думаете, а так же , что хотите увидеть следующим.
🛠 Предлагайте фичи и улучшения на GitHub.
ссылка на оригинал статьи https://habr.com/ru/articles/938710/
Добавить комментарий