Разработайте набор тестовых сценариев как позитивных так и негативных для следующей программы питон

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

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

Используемые инструменты

  1. Python
  2. Библиотека панд
  3. библиотека scikit-learn
  4. Jupyter Notebook как IDE.

Обзор набора данных и задач

Я собираюсь использовать набор данных обзора продукта, как упоминал ранее. Набор данных содержит обзоры детских товаров Amazon.

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

Голодные Игры Junior Pyhon разработчиков. Разбор первого тестового задания.

В нем три столбца: название, отзыв и рейтинг. Обзоры представляют собой текстовые данные, а рейтинги нумеруются от 1 до 5, где 1 — худший, а 5 — лучший обзор.

Наша работа — анализировать отзывы как положительные, так и отрицательные. Давайте посмотрим на набор данных. Здесь мы использовали первые пять записей для изучения данных.

import pandas as pd products = pd.read_csv(‘amazon_baby.csv’) products.head()

Предварительная обработка данных

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

Один из важных процессов очистки данных — избавиться от нулевых значений. Давайте проверим, сколько значений NULL у нас есть в наборе данных.

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

len(products) — len(products.dropna())

У нас есть нулевые значения в 1147 строках. Теперь проверьте, сколько всего данных у нас есть.

len(products)

Всего у нас 183531 данных. Итак, если мы удалим все нулевые значения, у нас все еще будет значительный объем данных для обучения алгоритма. Итак, давайте отбросим нулевые значения.

products = products.dropna()

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

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

for i in range(0,len(products)-1): if type(products.iloc[i][‘review’]) != str: products.iloc[i][‘review’] = str(products.iloc[i][‘review’])

Когда мы проводим анализ настроений, важно рассказать нашей модели, что такое положительные настроения, а что — отрицательные.

95% программистов на python не знают этого.

В нашей колонке оценок у нас есть оценки от 1 до 5. Мы можем определить 1 и 2 как плохие отзывы, а 4 и 5 как хорошие отзывы.

А как насчет трех?

3 находится посередине. Это ни хорошо, ни плохо. Просто средний. Но мы хотим классифицировать хорошие и плохие отзывы. Итак, я решил избавиться от всех троек.

Это зависит от работодателя или ваших представлений о хорошем или плохом. Если вы думаете, что поместите 3 в хороший слот для обзора, просто сделайте это. Но я избавляюсь от них.

products = products[products[‘rating’] != 3]

Жизнь — это движение! А тестирование — это жизнь 🙂

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

Поэтому я решила написать поясняющую статью.
Позитивное тестирование

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

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

Не работает основной сценарий, зачем дальше вообще что-то проверять? Так магазин и теряет пользователей.

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

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

Посмотрим на примере:
1. Функция вычисления корня в калькуляторе.
Основной тест-кейс — проверить, что корень из корректного числа действительно вычисляется.
Разбить можно на следующие классы эквивалентности:

  • После вычисления корня остается целое число (корень из 4 = 2)
  • После вычисления корня остается дробное число (корень из 3)

Хм, а что, если дробное число у нас будет не только после вычисления корня, но и до? Можем же мы взять корень из числа 2,2 ? Позитивный тест? Позитивный!

Читайте также:
Программа для Андроид чей номер телефона

Также можно разделить числа на небольшие, до 100, например. Потом взять интервал от 100 до размера int и третий будет еще больше, сколько влезает в наш калькулятор. 3 класса эквивалентности, проверяем по одному значению из интервала.

Не забудем и про граничные значения, проверим 0. Позитивный тест? А как же! Корень из 0 равен 0, а не ошибке!

Из основного, пожалуй, все.
2. Работа с корзиной в интернет-магазине.
О, вот где простор для воображения!

Пользователь столько разных сценариев может выполнить!! Но в первую очередь возьмем основные, самые короткие. Потому что если уж они не работают, то длинные цепочки (добавил — отредактировал — удалил — снова добавил — итд) проверять точно не стоит. Итак:

  • Добавление товара в корзину.
  • Добавление второго товара в корзину (того же самого, счетчик должен увеличиться).
  • Добавление второго товара другого типа.
  • Редактирование числа товаров, находящихся в корзине, увеличение на несколько, уменьшение.
  • Удаление товара из корзины.
  • Ваш вариант

Придумать тестов здесь можно очень много. Особенно, если начать проверять цепочки, например, добавил товар в корзину — передумал, удалил — ой, нет, все-таки надо, снова добавил.

Думаете, будет работать, если работает по отдельности? Не-е-е-ет, ребята, вы же тестировщики! Никогда не верьте программам «на слово»! Придумали сценарий? Проверьте!

Тем более что такой сценарий вполне может упасть, мы же уже удалили данный товар из корзины, так? Так вот система вполне может не дать нам его снова добавить. Типа «ты уже отказался, але, я все помню!». Корректно такое поведение? Нет!

Smile :)

А сам сценарий позитивный? Да! Хотя уже и с нотками извращения, надо признать

Негативное тестирование

Надо помнить, что негативное тестирование не менее важно, чем позитивное. Потому что наши пользователи — люди, а не роботы. А людям свойственно ошибаться. И всегда надо помнить про данный человеческий фактор.

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

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

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

Поэтому мы проводим негативное тестирование. Что такое негативное тестирование? Это ввод заведомо некорректных данных. Вводим и смотрим, как ведет себя программа, понятные ли сообщения об ошибке выдает.

Но как составлять такие тесты? Посмотрим на примерах:
1. Функция вычисления корня в калькуляторе.
Первое, что приходит на ум — а что будет, если вычислить корень из отрицательного числа?

Но что еще тут можно придумать?

  • Корень из пустоты — вспоминаем о граничных значениях, мы не можем ввести строку отрицательной длины, но вот граничное значение (строка нулевой длины) можем!
  • Корень из символов — надо проверить, что скажет система, если ввести или вкопипастить туда что-то символьное. Причем символы мы делим на русские, английские и спецсимволы!
  • Корень из значения «четыре» — также символы можно поделить на абракадабру и «типа число». Кстати, если уж говорить о таких «типа числах».
  • Попробуем ввести строку, которая обозначает число. И взять корень уже из нее.

Видите? На самом деле тестов не так уж и мало! Отдельно хочется высказать на тему «ввести очень большое число, максимально большое». Попробовать можно, почему нет? Но это более негативно скажется на сценарии возведения в квадрат, чем на вычислении корня.

В корне можно не вводить максимально большое число, а ввести такое число, чтобы корень из него (дробное значение) получился очень длинный и не уместился на экран, вот что тогда будет, обрежется или сломается?

2. Работа с корзиной в интернет-магазине.

Тут, опять же, можно найти числовое поле и поиграться с ним, как мы это только что проделали с калькулятором. Поле «количество товара» тут очень подойдет! Но, с другой стороны, скучно же, такие разные приложения и одни и те же тесты?

Кстати, не хочу сказать, что их не надо проводить. Надо, еще как надо! Просто я в статье повторяться уже не буду. Хочется здесь упомянуть о важной особенности всяких web-приложений и главном негативном тесте, который обычно все и ломает.

Запомните всего 2 слова — разные вкладки!

Чувствуете? Давайте поясню. Негативный тест на удаление товара из корзины — попытаться удалить уже удаленный товар. И тут начинаются варианты, как это может быть сделано:

  • Открыли корзину в 2 вкладках браузера. Сначала нажали «удалить» в одной, потом во второй. То есть попытка удалить то, что ты сам уже удалил из своей же корзины.
  • Попытка удалить удаленный админом товар. В 1 вкладке под админом удаляем товар вообще, в принципе, а в другой пытаемся его под пользователем удалить из корзины.

И кстати, также можно попробовать добавить удаленный админом товар или отредактировать его количество. А еще админ может не удалить товар, а перенести его в другую категорию. И вот тут сломаться ничего не должно. Если в случае удаления мы должны увидеть корректное сообщение об ошибке, то в случае переноса просто продолжить работу.

Читайте также:
Методы управления по программе

А что будет, если админ не передвинул товар в иерархии магазина (в другую категорию переместил, исходно неверно был размещен товар), а просто поправил, отредактировал описание? Тоже ничего сломаться не должно!

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

Например, мы можем создавать карточку — человека, здания, той же книги, чего-то еще. Попробуйте ее отредактировать в 2 окна. В одном изменить одно поле, сохранить, а потом во втором изменить другое поле и тоже сохранить. Или что-то удалить, а во втором окне добавить или изменить.

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

Хочется привести еще один пример из реальной практики. Тоже web-интерфейс, в котором можно нажать «создать» и добавить новую карточку. Пользователь добавляет, а у него через раз формочка падает. Почему?

Стали выяснять. И поняли. Пользователю надо было завести сразу много карточек (миграция), вот он и нажимал на «создать» несколько раз, зажав Ctrl (открыть в новой вкладке). И потом уже ходил по вкладкам и создавал.

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

Wink ;)

Так что, ребята, дерзайте! Открывайте разные вкладки и вперед, ищите информацию о том, как же, ну как же ведет себя именно ваша программа при противоречивых воздействиях на нее?

PS — это выдержка из моей книги для начинающих тестировщиков, написана в помощь студентам моей школы для тестировщиков

Заходите к нам на огонек! ツ
Posted by Ольга Назина (Киселева) at 15:39

37 комментариев:

Две из трех основных парадигм расписаны, это хорошо )
Впринципе, можно было бы уложиться в несколько строчек.

1. Тестирование на позитивных значениях.
Обычно используются пользовательские сценарии с корректными значениями.
Проверяем работоспособность заявленного функционала.

2. Тестирование на негативных значениях.
Тесты изначально построены так, что если они валятся — это хорошо.
В этом случае мы проверяем что софт не работает там, где не должен работать.

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

Впринципе, две последних парадигмы некоторые объединяют в одну, но я бы не стал этого делать.

Удобство работы с классической схемой несет в себе так же и такие плюсы как возможность структурировать тесты — она не зависит от логики. Хочешь функциональной, хочешь бизнес.

ИМХО, это самое первое что должен знать тест-дизайнер или проектировщик тестов. Если соваться в более сложные вещи, то можно наломать дров.
Я при собеседованиях это в первую очередь спрашиваю. И если чувак, работающий в профессии уже несколько лет претендует на гордое звание «тестировщик», но не знает базу — гоню ссаными тряпками.
Ответить Удалить

Да, Андрей, спасибо 🙂
Согласна, что негативные тесты можно разделить на простые ошибки и эксепшены. Это хороший подход 🙂 Удалить

>Тесты изначально построены так, что если они валятся — это хорошо.
Когда тесты валятся — это плохо. И неважно, какие тесты валятся, позитивные или негативные. Если валятся негативные, значит, программа не обрабатывает нестандартные ситуации так, как этого ожидает тест.
Негативные тесты — это не те, которые валятся, а те, которые проверяют обработку ошибок, нестандартных ситуаций, данных, которых не бывает при нормальной работе и т.п. Удалить

Кстати, чем отличается тест-дизайнер от проектировщика тестов?
И часто ли приходят люди, проработавшие несколько лет, но не знающие разделения на негативное и позитивное тестирование и претендующие на позиции тест-дизайнера? Удалить

Паша, имеется ввиду, что этих тестов должен быть негативный результат и тогда, если тест свалится — это будет pass в сценарии или чеклисте. Удалить

Интересно прочитать про такую статистику (что придумывают позитивные, а с негативными испытывают проблемы), потому как у меня на основе собеседований (задачка про треугольник) накоплена совершенно другая статистика: предложат несколько позитивных тестов, а дальше начинают всячески извращаться с негативными кейсами, толком, увы, не проверив работу приложения с нормальными данными.
Почему задание формулируется как «придумать несколько», а не все возможные? Видел очень много кандидатов, которые как раз придумав несколько базовых позитивных кейсов останавливаются на этом и говорят, что дальше тестировать не надо (в смысле, позитивные сценарии) и начинают придумывать негативные во всей их красе, т.к. считают, что негативных сценариев обычно больше, чем позитивных.
Такие кандидаты действуют ровно как описано в статье:
Например, для квадратного корня, проверим 3, 4, 2,2, 0 и что-нибудь большое.
хорошо, когда могут хотя бы объяснить, что это будет за большое число (например, Int и Int+1), дальше этого вообще мало кто идет. Хотя на самом деле «третий будет еще больше, сколько влезает в наш калькулятор» — это явно не один тест, потому что для выяснения, какова же реальная граница, придется провести несколько (десятков) тестов.
Опять же, что такое «влезает в наш калькулятор»? сколько я вижу? Или сколько символов он реально даст ввести? Или самое большое число, которое он реально может обработать (вспоминаем про экспоненциальную запись числа, которая сильно короче обычной, но при этом позволяет несколькими символами записать очень большие числа)?
но ведь базовые позитивные тесты на этом не заканчиваются, а только начинаются.
Квадратный корень из Pi или e юкдет верно вычислен?
Приоритет выполнения операции вычисления корня в формуле?
корень из 1? (есть всего два числа, корень из которых равен самому себе и стоит проверить оба)
А корень из 4,00000000000000001 или sqrt(10^2) или 1e+2?
Как на счет чисел, меньших единицы? Будет ли в данном случае функция работать верно? И начиная с какого дробной числа она начнет возвращать единицу в качестве результата?

Читайте также:
Лучшая программа для навигации Андроид без интернета

Я согласен, что базовые негативные тесты (вроде корня из отрицательного числа, хотя это внезапно может оказаться и позитивным тестом, если вспомнить, что существует мнимая единица :)) стоит прогнать где-то в серединке. И необходимо уметь придумывать негативные тесты. Но прежде чем начинать тестировать квадратные корни из иврита хорошо бы подумать, какие позитивные кейсы были пропущены в базовом наборе. Ответить Удалить

Да, ты прав, пожалуй, стоит просить дать полный комплект, а не несколько тестов 🙂
Хотя все, что ты тут нафлудил, мы проходим, просто немного дальше, на уроке по классам эквивалентности 🙂 А первые лекции вводные, так, просто чтобы понять, какие виды тестирования вообще существуют )) Удалить

Источник: okiseleva.blogspot.com

Порараз бирацца: как мы учились писать автотесты на Python и что у нас получилось

Привет, Хабр! Меня зовут Артем Иванюта, в «Магните» я занимаюсь тестированием информационных систем закупок. В статье я расскажу, как наша команда запускала автотесты web-интерфейсов силами одного сотрудника, как мы вписали их в CI/CD-процесс и с чем столкнулись, решая задачу. Кстати, вы наверняка уже догадались, но все-таки скажу — да, я и есть тот самый «один сотрудник». Так что никакого кликбейта.

Одиннадцать друзей Иванюты

В нашей команде 11 человек, мы отвечаем за тестирование 15 информационных систем. Всего в «Магните» их больше 600. Мы занимаемся тестированием web-инструментов цепочки поставок розничной сети. Это, например:

  1. система автоматизированных рабочих мест сотрудников;
  2. SRM-система снабжения сырьем собственных производств и закупочной логистики;
  3. электронный документооборот EDI;
  4. информационная система графика поставок товара в магазины,
  5. система управления ареалами AMS.

В масштабах «Магнита» это 25 000 пользователей — наших сотрудников, 4 500 — контрагентов и 16 000 торговых точек. Мы производим релизы ежедневно, а сам цикл в среднем составляет от 2 до 4 недель. По сути от нас зависит своевременная поставка товаров тысяч поставщиков на полки 16 тысяч магазинов (и много чего еще).

Восстание машин: срываем релизы

Мой путь в компании начался в 2014 году с отдела технического сопровождения торговых точек. Я занимался удаленной поддержкой и настройкой оборудования в гипермаркетах «Магнит». Это были кассы, системы эквайринга, серверы.

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

К началу 2019 года объем тестирования увеличился вдвое. Так количество тикетов на каждого возросло в среднем с 30 до 70 в месяц, а горизонт планирования релизов сдвинулся на 2 месяца вперед.

При этом количество людей в команде оставалось прежним — все те же 11 друзей Иванюты:)

Когда графики релизов начали срываться на регулярной основе, а рутинные операции занимать больше 50% времени, мы поняли, что дальше так не потянем. Тогда и было принято решение часть сценариев покрыть автотестами.

Путь в питонисты

До 2019 года никто из нашей команды не занимался автотестами, 100% тестов обрабатывались вручную. Никто из нашей команды не умел кодить. И конечно мы не могли снижать темп основных задач. Поэтому всей командой уйти в обучение автоматизации тестирования тоже было нельзя. Решили, что в разведку пойдет кто-то один.

Мне было интересно попробовать: я изучил опыт сообщества и остановился на python. Python считается универсальным языком, поскольку подходит под множество задач. К примеру, на Python написан Instagram, его используют в аналитике данных, запуске космических кораблей и. в автоматизации тестирования. Чтобы скорость работы команды не снижалась, приняли совместное решение — я иду обучаться, команда забирает 80% моих задач.

Какие цели мы поставили для внедрения автотестов:

  1. Увеличение скорости тестирования. Мы накопили довольно большую библиотеку регрессионных сценариев тестирования различных веб-интерфейсов. Релизы в команде проводятся каждый день, поэтому регресс востребован и выполняется тестировщиками регулярно вручную. Его выполнение занимало не меньше 8 часов, а автоматизированные тесты могли сократить время на обработку регресса до 95% и больше.
  2. Повышение качества тестирования. При частом прогоне рутинных проверок всегда есть риск пропустить ошибку. Машина же совершит её с меньшей вероятностью за счёт многократного прогона автотестов. Разработчик самостоятельно может запустить автотестирование после изменения кода без помощи тестировщика. То есть это время команды освобождается для других задач.
  3. Рост экспертизы. Разработанные автотесты нужно сопровождать и развивать. Мы решили сделать ставку на развитии своей команды и запустили «Школу автотестирования». Я на себе прочувствовал, как «заряжает» обучение на реальных задачах. В Магнит я прошел такой опыт дважды, получив и новую экспертизу, и развитие. Программу Школы выстроили по такому же принципу — много практики и реального опыта.
  4. Поддержка DevOps-стратегии компании. В 2018 году «Магнит» взял курс на развитие DevOps. Наши 15 систем не стали исключением. Их ждали обновление и переход на новые практики и инструменты. Автотесты — одна из обязательных стадий процесса CI/CD.

Вот так архитектурно он выстроен у нас:

Так мы договорились о целях и тактике. Следующая задача — понять, что именно покрывать автоматизацией.

Автоматизируем регресс

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru