Принцип тестирования заблуждение об отсутствии ошибок подразумевает

Время на прочтение
5 мин

Количество просмотров 38K

Нам известны 7 принципов тестирования и сейчас мы их подробно разберём.

Итак, приступим:

  1. Исчерпывающее тестирование невозможно

  2. Тестирование демонстрирует наличие дефектов, а не их отсутствие

  3. Заблуждение об отсутствии ошибок

  4. Раннее тестирование сохраняет время и деньги

  5. Принцип скопления или кластеризация дефектов

  6. Тестирование зависит от контекста

  7. Парадокс пестицида 

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

В переводе с латинского При́нцип — это основа, начало, первоначало, и можно сказать, что принципы тестирования — это основы тестирования.

1️. Исчерпывающее тестирование невозможно

Давайте начнём так. Допустим, есть некий сайт. На этом сайте присутствует форма с полем для ввода какого-либо значения.

Возникает вопрос: а сколько различных комбинаций, их общее количество нам доступно для использования? И если нет каких-то конкретных требований, то вводить туда мы можем всё что угодно: любые буквы разных алфавитов, числа, символы, эмоджи, соответственно текст любой длины…

И, конечно, ответ будет: 

Ну давайте предположим, что максимально в поле мы можем ввести только 3 символа. Даже и в этом случае количество комбинаций, если брать во внимание, что UTF-8 поддерживает 2,164,864 доступных символа, будет равно:

Х = 2,164,864³ =10 145 929 857 329 004 544

Сколько же комбинаций выйдет, если в поле для ввода текста мы можем ввести 100 символов? А 1000 или с N количеством нулей?

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

2️. Тестирование демонстрирует наличие дефектов, а не их отсутствие

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

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

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

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

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

3️. Заблуждение об отсутствии ошибок

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

Надо помнить такую аксиому – не существует какого-либо продукта без багов или ошибок.

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

Дефекты однозначно будут. Но в тестировании и нет такой задачи, чтобы выявить 100% багов, т.к. мы уже знаем, что это невозможно, исходя из первых трёх принципов. Главное здесь – найти наиболее критичные ошибки.

Присутствует в тестировании и такой парадокс – не все ошибки нужно исправлять). Но это отдельная тема.

4. Раннее тестирование сохраняет время и деньги

Это принцип говорит о том, что чем раньше выявится та или иная проблема – тем меньше средств и трудозатрат потребуется для её устранения. Соответственно, если баг попадёт в «прод» или ещё хуже, если его найдёт пользователь – исправление такого дефекта обойдётся немалой кровью для всей команды. Помимо того, что удаление его будет стоить бо́льших денег, нежели на начальной стадии разработки, может получиться так, что этот дефект затронет другой функционал. И тогда проблемы начнут накапливаться как снежный ком. Сколько кода потребуется переписать разработчикам? Сколько времени уйдет на исправление и тестирование? Тут вам и сорванные сроки релизов, рассерженное руководство, потеря нервных клеток и т.д. Сюда же добавим недовольство или даже потерю клиентов, ну и все остальные вытекающие…

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

5. Принцип скопления или кластеризация дефектов

Существует такое определение – наибо́льшее количество дефектов обычно содержится в небольшо́м количестве модулей.

Простыми словами кластеризация – это группировка (на кластеры) множества объектов, схожих между собой по каким-либо параметрам. Представим полки и витрины в магазине – товары подразделены на хлебобулочные, молочные, мясные, напитки и др. Это и есть кластеризация.

Давайте проведём параллель с багами. Ошибки скапливаются в определённых местах, например, там, где код наиболее сложный или некорректно написан. Любой продукт состоит из модулей – кластеров в нашем случае. Если в каком-то модуле нашлось несколько багов, — это сигнал к тому, чтобы ещё внимательнее протестировать или даже перелопатить его с особой тщательностью на наличие скрытых дефектов.

6. Тестирование зависит от контекста

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

По каким характеристикам различать контекст:

  • по типу продукта – web, desktop, мобильное приложение, сервис и др.;

  • по цели продукта – обеспечение безопасности, Game, продажа товаров и др.;

  • по проектной команде – специализация, количество человек, опыт и т.д.;

  • по доступным инструментам – что присутствует на проекте, для успешной реализации;

  • по срокам – как построен рабочий процесс, как часто выходят релизы, время между ними на подготовку;

  • по ожидаемому уровню качества – чем выше требования, тем тщательнее нужно тестировать.

Опытные QA-engineer знают, что перед любым тестированием нужно провести анализ и сформировать план и стратегию проверок. Ну и затем приступать к составлению тестовой документации.

7. Парадокс пестицида

Почему именно так назван этот принцип? Здесь всё просто. Википедия говорит нам, что Пестици́д (лат. pestis «зараза» + caedo «убивать») – ядовитое вещество, используемое для уничтожения вредителей и различных паразитов. Возьмём пример из жизни. Если использовать один и тот же пестицид на протяжении долгого времени, например, для истребления тараканов, то со временем его эффективность упадёт, так как у этих насекомых выработается устойчивость к одному и тому же препарату.

То же самое относится и к багам и процессу тестирования. Если к какому-либо функционалу применять постоянно повторяющийся набор тестов – то эти проверки в скором времени будут неэффективны в нахождении новых дефектов.

Поэтому тест-кейсы должны постоянно обновляться и видоизменяться. Важно пользоваться такими рекомендациями:

  • добавлять новые тесты;

  • просматривать и изменять существующие;

  • применять разные виды и техники тестирования;

  • осуществлять тестирование новыми сотрудниками и др.

 В целом посмотреть на продукт под другим углом.

Можно отметить здесь ещё тот факт, что в наибольшей степени парадокс пестицида может проявляться в регрессе и автотестах.

Заключение

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

Принцип 6. Тестирование зависит от контекста
Тестирование выполняется по-разному, в зависимости от контекста. Например, тестирование систем, критических с точки зрения безопасности, проводится иначе, чем тестирование сайта интернет-магазина.
Этот принцип тесно связан с понятием риска. Что такое риск? Риск — это потенциальная проблема. У риска есть вероятность (likelihood) — она всегда выше 0 и ниже 100% — и есть влияние (impact) — те негативные последствия, которых мы опасаемся. Анализируя риски, мы всегда взвешиваем эти два аспекта: вероятность и влияние.
То же можно сказать и о мире ПО: разные системы связаны с различными уровнями риска, влияние того или иного дефекта также сильно варьируется. Одни проблемы довольно тривиальны, другие могут дорого обойтись и привести к большим потерям денег, времени, деловой репутации, а в некоторых случаях даже привести к травмам и смерти.
Уровень риска влияет на выбор методологий, техник и типов тестирования.
Принцип 7. Заблуждение об отсутствии ошибок
Нахождение и исправление дефектов бесполезно, если построенная система неудобна для использования и не соответствует нуждам и ожиданиям пользователей.
Заказчики ПО — люди и организации, которые покупают и используют его, чтобы выполнять свои повседневные задачи — на самом деле совершенно не интересуются дефектами и их количеством, кроме тех случаев, когда они непосредственно сталкиваются с нестабильностью продукта. Им также неинтересно, насколько ПО соответствует формальным требованиям, которые были задокументированы. Пользователи ПО более заинтересованы в том, чтобы оно помогало им эффективно выполнять задачи. ПО должно отвечать их потребностям, и именно с этой точки зрения они его оценивают.
Даже если вы выполнили все тесты и ошибок не обнаружили, это еще не гарантия того, что ПО будет соответствовать нуждам и ожиданиям пользователей.
Иначе говоря, верификация не равна валидации.

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

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

Принципы тестирования

7 принципов тестирования в деле

Исчерпывающее тестирование невозможно

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

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

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

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

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

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

7 принципов тестирования

7 принципов тестирования

Тестирование демонстрирует наличие дефектов

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

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

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

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

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

Заблуждение об отсутствии ошибок

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

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

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

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

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

Раннее тестирование сохраняет время и деньги

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

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

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

Принцип скопления или кластеризация дефектов

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

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

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

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

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

Принципы тестирования примеры и критика

Принципы тестирования примеры и критика

Тестирование зависит от контекста

Принцип «Тестирование зависит от контекста» подчеркивает, что каждый проект и продукт уникален и имеет свои собственные требования и особенности. Этот принцип говорит о том, что методы тестирования, которые подходят для одного проекта, могут не работать для другого. Тестирование должно быть контекстуальным, и тестировщикам нужно учитывать множество факторов, таких как:

  • Бизнес-требования
  • Требования к безопасности
  • Требования к производительности
  • Целевая аудитория
  • Технические ограничения

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

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

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

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

Парадокс пестицида

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

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

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

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

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

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

1. Исчерпывающее тестирование невозможно

Я думаю, сейчас всем должно быть понятно, что для современных приложений исчерпывающее тестирование невозможно.

Если непонятно, то давайте объясню.

Представим форму, где нужно будет собрать себе обед. На форме будет 3 списка, в которых нужно выбрать по одному значению. В каждом списке есть по 3 опции.

Для того чтобы протестировать и перебрать все-все значения и комбинации нам потребуется 27 тестов (3 в 3-ей степени).
Ну, звучит пока реально. А что будет если мы расширим наше меню напитками и салатами тоже по 3 варианта?
Количество тестов превратится в 243 (3 в 5-ей степени). А что если добавить больше вариантов блюд? А что если выбор блюд из какой-то категории сделать необязательным? Количество тестов начнём расти в геометрической прогрессии.

Кстати, на форме были только позитивные значения. Если на форме можно будет вводить негативные значения, то количество тестов будет расти ещё сильнее.

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

Мне страшно представить тестировщика, который перебрал все возможные варианты на этой форме и ему сказали сделать это ещё раз 🙂

Поэтому в тестировании мы используем анализ рисков и приоритетов, для того чтобы проверить наиболее показательные варианты значений. Для этого существуют техники тестирования (Test techniques), либо их ещё называют техники тест-дизайна (Test design techniques). О них поговори как-нибудь в другой раз.

2. Принцип скопления дефектов

Этот принцип говорит о том, что в наименьшем количестве мест, находится наибольшее количество дефектов. Это чем-то похоже на правило Парето 80/20, где 80% дефектов находятся в 20% функций.

Почему дефекты любят скапливаться в одном месте?
Очень часто какая-то область кода может быть сложной или плохо написанной. Поэтому в ней и может скапливаться бесчисленное количество дефектов.

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

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

Со временем тенденция может меняться, так что нам нужно отслеживать где и сколько багов у нас появляется.

3. Эффективность раннего тестирования

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

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

7 Principles of Testing - Part 2

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

Наглядно принцип раннего тестирования

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

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

4. Парадокс пестицида

Если одни и те же тесты проходить снова и снова, то рано или поздно они перестанут находить дефекты.

QA] Hiệu ứng thuốc trừ sâu (Pesticide paradox)

То есть, наш продукт со временем адаптируется к нашим тестам.

Но это не будет означать, что в нем не будет дефектов.

Для того, чтобы избежать таких ситуаций рекомендуется следующее:

  • Использовать разные данные при тестировании
  • Постоянно пересматривать и улучшать свои тесты
  • Добавлять новые тесты
  • Использовать разные техники тестирования
  • Проводить ротацию кадров

Неформальные техники тестирования основанные на опыте (например, исследовательское (Exploratory testing) и свободное тестирование (Ad-hoc)) очень хорошо помогают бороться с парадоксом пестицида.

5. Заблуждение об отсутствии ошибок

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

Продуктов без багов (Bug free) не существует!

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

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

К тому же, уверены ли вы, что в вашем продукте нет нефункциональных багов?

Например, удобства использования, производительности, совместимости, безопасности и так далее.

6. Тестирование показывает наличие дефектов

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

Ведь они есть всегда 🙂 см. принцип 5.

Этот принцип как раз и говорит, что тестирование напрямую не улучшает качество, а лишь показывает, что в продукте есть дефекты. Это помогает сделать качество лучше тем, что мы знаем о проблемах и можем их исправить. А вот уже улучшением качества может заниматься Quality Assurance.

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

Ведь контекст может быть разный.

Что может входить в контекст тестирования:

  • Тип продукта — веб, десктоп, мобайл, сервис и тд
  • Цель продукта — продажа товаров, игра, обеспечение безопасности
  • Проектная команда — количество человек, специализация, опыт и тд
  • Сроки — как много времени у нас есть до релиза
  • Ожидаемый уровень качества — чем выше показатель, тем тщательнее нужно тестировать
  • Риски — существует огромное число рисков, которые нужно учитывать. Например, из-за того, что команда неопытная в разработке продукта с заявленными целями и типом, есть риск, что в продукте может быть много багов. Тем самым, достижение ожидаемого уровня качества может затянуться.
  • Доступные инструменты — есть ли у нас возможность пользоваться какими-то инструментами для тестирования или необходимо изобретать самим.
  • И другие моменты

Исходя из данных нашего контекста, мы и будем строить эффективный процесс тестирования.

Теория тестирования от А до Я.

19 mins

best

testing

qa

interview


Вопросы на собеседованиях Trainee/Junior/Middle Manual QA в среднем на 50% состоят из теории тестирования.

Навигация: 🔗

1. Тестирование. Качество ПО

2. Валидация vs Верификация

3. Цели тестирования

4. Этапы тестирования

5. Тест-план

6. Тест-дизайн

7. Техники тест-дизайна

8. Продвинутые техники тест-дизайна

9. Бонусные и Авторские Техники тест-дизайна

11. Test Case (Тестовый случай)

12. Check-list (Чек-лист)

13. Bug Report (Баг-репорт)

14. Severity vs Priority

15. Traceability Matrix (Матрица соответствия требований)

16. Defect / Error / Bug / Failure

17. Уровни тестирования (Levels of Testing)

18. Виды / Типы тестирования (Testing Types)

19. Принципы тестирования (Principles of Testing)

20. Статическое и Динамическое тестирование

21. Требования (Requirements)

22. Жизненный цикл бага

23. Жизненный цикл разработки ПО

24. Методологии разработки


1. Тестирование. Качество ПО 🔗

Тестирование

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

Тестирование

— это одна из техник контроля качества, включающая в себя активности по:

  • Test Management (планированию работ)
  • Test Design (проектирование тестов)
  • Test Execution (выполнение тестов)
  • Test Analysis (анализ результатов тестирования)

Качество ПО (Software Quality)

— это совокупность характеристик программного обеспечения, относящихся к его способности удовлетворять установленные и предполагаемые потребности.

2. Валидация vs Верификация 🔗

Верификация (verification)

— оценка соответствия продукта требованиям (спецификации).

Отвечает на вопрос: “Система работает в соответствии с требованиями?”

Валидация (validation)

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

Отвечает на вопрос: “Требования удовлетворяют ожидания пользователя?”

3. Цели тестирования 🔗

  1. Повысить вероятность того, что приложение:
    • будет соответствовать всем описанным требованиям.
    • будет работать правильно при любых обстоятельствах.
  2. Предоставление актуальной информации о состоянии продукта на данный момент.

4. Этапы тестирования 🔗

  1. Анализ продукта
  2. Работа с требованиями
  3. Разработка тест плана
  4. Создание тестовой документации
  5. Тестирование
  6. Отчет о тестировании (test report)
  7. Стабилизация
  8. Эксплуатация

5. Тест план 🔗

Test Plan — это документ, описывающий весь объем работ по тестированию

Отвечает на вопросы:

  • Что?
  • Когда?
  • Критерии начала/окончания тестирования.
  • Окружение (environment) dev/staging/production?
  • Подходы/техники/инструменты/виды тестирования?
  • Браузеры/версии/OS/разрешения экрана?
  • Кто? Обязанности? Ресурсы? Обучение?
  • Сроки?
  • График?
  • Стратегия тестирования.
  • Ссылки на документацию.
  • Ссылки на требования.

6. Тест дизайн 🔗

Test design — это этап процесса тестирования ПО, на котором проектируются и создаются тест кейсы, в соответствии с критериями качества и целями тестирования.

  • Тест аналитик — определяет «ЧТО тестировать?»
  • Тест дизайнер — определяет «КАК тестировать?»
  • Реальность — все делает 1 человек :)

7. Техники тест дизайна 🔗

Эквивалентное Разделение (Equivalence Partitioning)

  • Как пример, у вас есть диапазон допустимых значений от 1.00 до 10.00 долларов, вы должны выбрать одно любое верное значение внутри интервала, скажем, 5.00, и любые неверные значения вне интервала, например 0.99 и 11.00.

test design equvivalence

Анализ Граничных Значений (Boundary Value Analysis)

  • Как пример, у вас есть диапазон допустимых значений от 1.00 до 10.00 долларов.
  • Two value (двузначный) BVA: валидные граничные значения 1.00, 10.00, и невалидные значения 0.99 и 10.01.
  • Three/Full value (трехзначный) BVA: валидные граничные значения 1.00, 1.01, 10.00, 9.99, и невалидные значения 0.99 и 10.01.

test design BVA

Причина / Следствие (Cause/Effect)

  • ввод комбинаций условий (причин), для получения ответа от системы (следствие).
  • Например, вы проверяете возможность добавлять клиента:
  • Причина: необходимо заполнить поля «Имя», «Адрес», «Номер Телефона» и нажать кнопку «Добавить».
  • Следствие: После нажатия на кнопку «Добавить», система добавляет клиента в базу данных и показывает его номер на экране.

Предугадывание ошибки (Error Guessing)

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

Например, спецификация говорит: «пользователь должен ввести код».

Тестировщик будет думать: «Что, если я не введу код?», «Что, если я введу неправильный код?»…

test design error guessing

8. Продвинутые техники тест дизайна 🔗

Удиви интервьюера. Вааааау...

Попарное тестирование (Pairwise Testing)

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

Звучит сложно, но на практике использовать эту технику очень просто и логично.

  • Суть техники — мы не проверяем все сочетания всех значений, но проверяем ВСЕ ПАРЫ значений.

test design pair wise

Таблица принятия решений (Decision table)

  • В таблицах решений представлен набор условий, одновременное выполнение которых должно привести к определенному действию/решению.

test design decision table

Диаграмма (граф) состояний-переходов (State Transition diagram)

  • диаграмма для описания поведения системы.
  • Система имеет конечное число состояний и переходов между состояниями.
  • Диаграмма может быть переведена в Таблицу состояний-переходов (или в таблицу принятия решений).

State transition diagram

Use case (пользовательский сценарий)

    Это сценарий взаимодействия пользователя с системой для достижения определенной цели.

Use case содержит:

  • кто использует систему (например роль админ/покупатель/продавец).
  • что пользователь хочет сделать.
  • цели пользователя.
  • шаги, которые выполняет пользователь.
  • описание того, как система реагируют на действия пользователя.

9. Бонусные и авторские техники тест дизайна 🔗

Просвети интервьюера. Открой ему глаза.

Семи-Исчерпывающее тестирование (Semi-Exhaustive Testing)

  • проверка всех возможных комбинаций входных значений. Как правило, на практике применение техники Exhaustive Testing не представляется возможным. (см. принцип тестирования №2 Исчерпывающее тестирование недостижимо (Exhaustive testing is impossible))

    Иногда на практике встречаются случаи, когда стандартные техники не дают достаточного уровня уверенности в работоспособности системы. Например, в системах связанных с медициной или авиа сферами, иногда стоит применять Semi-Exhaustive Testing.

    Не забываем про принцип тестирования №6 Тестирование зависит от контекста (Testing is context dependent). Думаем головой, когда уместно применение этой техники, а когда нет.

Блок-схема (block scheme/diagram)

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

test design block schema

Шляпы / роли

    Техника “Шляпы / роли” чем-то схожа с техникой составления тест кейсов по Use Case.

    Принцип: одеваем шляпу определенной роли пользователя и представляем себя в его роли.

    Пример: “одеваем” шляпу Кастинг Директора и размышляем как новый функционал будет работать для этой роли. Представляем, какие могут быть зависимости и особенности системы для Кастинг Директора. Размышляем, какие бизнес цели преследует Кастинг директор в нашей системе и как поведение системы может отличаться от других ролей. Потом “одеваем” шляпу Актера, Агента, Админа…

test design hats roles

Техники тест дизайна, о которых пока нигде не слышал: 🔗

Каждый имеет право придумать свою технику тест дизайна. Тестирование - это не бездумное применение всем известных техник. © Илларион

    О техниках “Разговорчики-driven”, “Analytics-driven”, “Bug-driven” я пока нигде не слышал.

    ⚠️ Интервьюеры могут быть отличниками, которые ограничиваются только книжными понятиями и не выходят за рамки (thinking out of the box). Поэтому будьте аккуратны с озвучиванием этих техник интервьюеру, особенно, если у вас проблемы с объяснением и примерами)) Не ограничивайте себя существующими техниками, думайте, фантазируйте.

Разговорчики-driven (talks-driven)

Собираем в одной комнате/звонке одного или нескольких программистов, менеджеров, клиентов, тестировщиков и тд. И начинаем допрос о конкретной функции или всей системе.

    Если фантазия не работает, то задаем Wh-вопросы:

what, when, where, who, whom, which, whose, why and how — что, когда, где, кто, кому, какой, чей, почему, как

    Для продвинутых: сначала собираем всех по одному, а потом по несколько человек. Не выпускаем, пока не получим все ответы и не решим какие тесты проектировать.

Аналитика-driven (analytics-driven)

    Если на проекте используется аналитика, например при кликах на кнопки или при открытии страниц отправляются ивенты (events) в систему для аналитики, то можно использовать данные аналитики для составления тест кейсов.

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

Баг-driven (bugs-driven)

    Принцип тестирования №4 Скопление дефектов (Defects clustering) гласит, что “большая часть дефектов содержится в небольшом количестве модулей”.

    Основываясь на найденных ранее багах и на обращениях клиентов в службу поддержки, можно определить “больные” места системы и сконцентрировать тест кейсы на этих модулях системы.

    Дополнительно можно посидеть над найденными багами и подумать “а может ли аналогичный баг быть в другой части системы?”.

Исследовательское тестирование (exploratory testing)

  • это одновременное изучение системы, проектирование тестов (тест дизайн) и непосредственно тестирование.
  • Данная техника базируется на опыте тестировщика (experience based).
  • Пример: приходит тестировщик на новый проект и начинает одновременно изучать сайт, писать чек-лист и проходить этот чек-лист (тестировать).

Ad-hoc тестирование

  • Перевод от автора статьи — “тестирование от балды”.
  • Вид тестирования, который выполняется без подготовки к тестам, без определения ожидаемых результатов, без проектирования тестовых сценариев.
  • Неформальное, импровизационное тестирование.

11. Test Case (тестовый случай) 🔗

Test Case

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

Test Case

— это описание проверки работы системы, которое может выполнить любой человек из команды.

Test Case

— это описание проверки системы на соответствие требованиям.

Тест кейс состоит из:

  • ID (идентификатор)
  • Title (название)
  • Type (тип)
  • Priority (приоритет)
  • Preconditions (предусловия)
  • Steps (шаги)
  • Expected Result (ожидаемый результат)
  • Post conditions (пост условия) — например очистка данных или возвращение системы в первоначальное состояние.

Тест кейсы разделяются на позитивные и негативные:

  • Позитивный тест кейс использует только корректные данные и проверяет, что приложение правильно выполнило вызываемую функцию.
  • Негативный тест кейс оперирует как корректными, так и некорректными данными (минимум 1 некорректный параметр) и ставит целью проверку исключительных ситуаций (срабатывание валидаторов), а также проверяет, что вызываемая системой функция не выполняется при срабатывании валидатора.

Примеры и лучшие практики создания тест кейсов —

12. Check-list (Чек-лист) 🔗

Check list

— это документ, описывающий, что должно быть протестировано.

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

Примеры и лучшие практики создания чек-листов —

13. Bug report (баг репорт) 🔗

Bug Report

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

Основные составляющие Bug report:

  • ID (идентификатор)
  • Название (Title)
  • Короткое описание (Summary)
  • Проект (Project)
  • Компонент приложения (Component)
  • Номер версии (Version)
  • Серьезность (Severity)
  • Приоритет (Priority)
  • Статус (Status)
  • Автор (Author)
  • Назначен на (Assignee)
  • Окружение (Environment: dev/test/staging/prod/etc.)
  • App/build version (версия билда/приложения)
  • Шаги воспроизведения (Steps to Reproduce)
  • Фактический Результат (Actual Result)
  • Ожидаемый результат (Expected Result)

Дополнительные составляющие Bug report:

  • Screenshots (скриншоты)
  • Video (видео)
  • Credentials (login + password)
  • Browser console errors (логи с браузера)
  • Mobile app logs (логи с мобилки)
  • Server logs (логи с сервера)

  • API Requests (апи запросы)
  • Analytics events (ивенты с аналитики)
  • Database data (данные из базы данных)
  • Database queries (запросы в базу)

  • Date and time (дата и время)
  • Comments/Notes (комментарии/заметки)
  • Link tasks/bugs (подвязка других задач/багов к текущему)

  • HAR archive — архив со всеми запросами в Network

14. Severity vs Priority 🔗

Серьезность (Severity)

— это атрибут, характеризующий влияние дефекта на работоспособность приложения.

В теории Severity выставляется тестировщиком.

Градация Severity:

  • S1 Блокирующая (Blocker)
  • S2 Критическая (Critical)
  • S3 Значительная (Major)
  • S4 Незначительная (Minor)
  • S5 Тривиальная (Trivial)

Приоритет (Priority)

— это атрибут, указывающий на очередность выполнения задачи или устранения дефекта.

Чем выше приоритет, тем быстрее нужно исправить дефект.

В теории Priority выставляется менеджером, тимлидом или заказчиком.

Градация Priority:

  • P1 Высокий (High)
  • P2 Средний (Medium)
  • P3 Низкий (Low)

Реальность: на всех проектах, где я работал, был только priority :)

Реальность: на разных проектах разные градации.

Пример вопроса на собеседовании про Severity / Priority —

15. Traceability matrix (Матрица соответствия требований) 🔗

    Traceability matrix — это двумерная таблица, содержащая соответствие функциональных требований и тест кейсов.

В заголовках колонок таблицы расположены требования, а в заголовках строк — ID тест кейсов.

На пересечении — отметка, означающая, что требование текущей колонки покрыто тестовым сценарием текущей строки.

16. Defect / Error / Bug / Failure 🔗

Дефект (он же баг)

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

Bug (defect)

— ошибка программиста (или другого члена команды), то есть когда в программе что-то идёт не так как планировалось и программа выходит из-под контроля.

Например, когда никак не контролируется ввод пользователя, в результате неверные данные вызывают краши (crash) или иные «приколы» в работе программы. Либо программа построена так, что изначально не соответствует тому, что от неё ожидается.

Error (ошибка)

— действие, которое привело к неправильному результату.

Пример 1 — ввод букв в поля, где требуется вводить цифры (возраст, количество товара и т.п.). Error: “поле должно содержать только цифры”.

Пример 2 — регистрация с уже существующим в системе емейлом. Error: “этот емейл уже используется”.

Failure

— сбой (причём необязательно аппаратный) в работе компонента, всей программы или системы.

То есть, существуют такие дефекты, которые приводят к сбоям. И существуют такие, которые не приводят. UI-дефекты например. Но аппаратный сбой, никак не связанный с software, тоже является failure.

17. Уровни Тестирования (Levels of testing) 🔗

1. Модульное тестирование (Unit Testing)

Тестирование кода классов, функций, модулей в коде. Обычно выполняется программистами.

2. Интеграционное тестирование (Integration Testing)

Тестирование взаимодействия между несколькими классами, функциями, модулями. Например тестирование API через Postman.

3. Системное тестирование (System Testing)

Проверка как функциональных, так и нефункциональных требований к системе.

4. Приемочное тестирование (Acceptance Testing)

Проверка соответствия системы требованиям и проводится с целью:

  • определения удовлетворяет ли система приемочным критериям;
  • вынесения решения заказчиком/менеджером принимается приложение или нет.

18. Виды / типы тестирования (Testing types) 🔗

18.1. Функциональные виды тестирования

  • Функциональное тестирование (Functional testing)
  • Тестирование пользовательского интерфейса (GUI Testing)
  • Тестирование безопасности (Security and Access Control Testing)
  • Тестирование взаимодействия (Interoperability Testing)

18.2. Нефункциональные виды тестирования

  • Все виды тестирования производительности (Performance):
    • нагрузочное тестирование (Load Testing) — много пользователей.
    • стрессовое тестирование (Stress Testing) — очень много данных и/или пользователей (пиковые значения).
    • объемное тестирование (Volume Testing) — много данных.
    • тестирование стабильности или надежности (Stability / Reliability Testing)
  • Тестирование установки (Installation testing)
  • Тестирование удобства пользования (Usability Testing)
  • Тестирование на отказ и восстановление (Failover and Recovery Testing)
  • Конфигурационное тестирование (Configuration Testing)

18.3. Связанные с изменениями виды тестирования

  • Дымовое тестирование (Smoke Testing)
  • Регрессионное тестирование (Regression Testing)
  • Повторное тестирование (Re-testing)
  • Тестирование сборки (Build Verification Test)
  • Санитарное тестирование или проверка согласованности/исправности (Sanity Testing)

Testing types

19. Принципы тестирования (Principles of testing) 🔗

1. Тестирование демонстрирует наличие дефектов (Testing shows presence of defects)

Тестирование может показать, что дефекты присутствуют в системе, но не может доказать, что их нет.

2. Исчерпывающее тестирование недостижимо (Exhaustive testing is impossible)

Полное тестирование с использованием всех комбинаций вводов и предусловий физически невыполнимо, за исключением тривиальных случаев.

3. Раннее тестирование (Early testing)

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

4. Скопление дефектов (Defects clustering)

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

5. Парадокс пестицида (Pesticide paradox)

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

6. Тестирование зависит от контекста (Testing is context dependent)

Тестирование выполняется по-разному в зависимости от контекста.

7. Заблуждение об отсутствии ошибок (Absence-of-errors fallacy)

Обнаружение и исправление дефектов не помогут, если созданная система не подходит пользователю и не удовлетворяет его ожиданиям и потребностям.

20. Cтатическое и динамическое тестирование 🔗

Статическое (static) тестирование

Производится БЕЗ запуска кода программы.

Примеры: тестирование требований/документации, код ревью, статические анализаторы кода.

Динамическое (dynamic) тестирование

Производится С запуском кода программы.

21. Требования (requirements) 🔗

    Требования — это спецификация (описание) того, что должно быть реализовано.

Требования описывают то, что необходимо реализовать, без детализации технической стороны решения. “Что”, а не “как”.

Требования к требованиям:

  1. корректность
  2. недвусмысленность
  3. полнота
  4. непротиворечивость
  5. упорядоченность по важности и стабильности
  6. проверяемость (тестопригодность)
  7. модифицируемость
  8. трассируемость
  9. понимаемость

22. Жизненный цикл бага 🔗

Bug lifecycle

23. Жизненный цикл разработки ПО 🔗

Software Development Life Cycle (SDLC):

  1. Идея (Idea)
  2. Сбор и анализ требований (Planning and Requirement Analysis)
  3. Документирование требований (Defining Requirements)
  4. Дизайн (Design Architecture)
  5. Разработка (Developing)
  6. Тестирование (Testing)
  7. Внедрение/развертывание (Deployment)
  8. Поддержка (Maintenance)
  9. Смерть (Death)

24. Методологии разработки 🔗

Waterfall

V-model

Spiral

Kanban

Scrum

Scrum-ban

Предложения и пожелания 🔗

    Всегда рад получать конструктивную критику по контенту лекций и этой статье. Не стесняйтесь 🤗 ☀️

Источники: статья на доу https://dou.ua/forums/topic/13389 www.protesting.ru, bugscatcher.net, qalight.com.ua, thinkingintests.wordpress.com, книга ISTQB, www.quizful.net, bugsclock.blogspot.com, www.zeelabs.com, devopswiki.net, hvorostovoz.blogspot.com.

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Принцип проб и ошибок
  • Принципиальная ошибка это
  • Принцип ортогональности ошибки и наблюдения
  • Принятие решения на основе проб и ошибок
  • Принудительная проверка диска на ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии