Skip to content

Instantly share code, notes, and snippets.

@Stylesproline
Last active February 1, 2023 14:24
Show Gist options
  • Save Stylesproline/4fea187bc3d7164154ce6fbf70bb043c to your computer and use it in GitHub Desktop.
Save Stylesproline/4fea187bc3d7164154ce6fbf70bb043c to your computer and use it in GitHub Desktop.

Курсы тестирования ПО (тестировщиков) : тестирование программного обеспечения и web-приложений

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

На протяжении десятилетий развития разработки ПО к вопросам тестирования и обеспече- ния качества подходили очень и очень по-разному. Можно выделить несколько основных «эпох тестирования». В 50–60-х годах прошлого века процесс тестирования был предельно формализован, отделён от процесса непосредственной разработки ПО и «математизирован». Фактически тестирование представляло собой скорее отладку программ (debugging). Существовала концепция т.н. «ис- черпывающего тестирования (exhaustive testing)» — проверки всех возможных путей выполне- ния кода со всеми возможными входными данными. Но очень скоро было выяснено, что исчер- пывающее тестирование невозможно, т.к. количество возможных путей и входных данных очень велико, а также при таком подходе сложно найти проблемы в документации.

Задание 1.1.a:

представьте, что ваша программа по трём введённым целым числам определяет, может ли существовать треугольник с такими длинами сторон. Допустим, что ваша программа выполняется в некоей изолированной идеальной среде, и вам все- го-то осталось проверить корректность её работы на трёх 8-байтовых знаковых целых числах. Вы используете автоматизацию, и компьютер может провести 100 миллионов проверок в секунду. Сколько займёт проверка всех вариантов? А задумались ли вы, как подготовить для этого теста проверочные данные (на осно- ве которых можно определить, верно ли сработала программа в каждом конкретном случае)?


основные типы данных:
  •     байт;
    
  •     слово;
    
  •     двойное слово;
    
  •     учетверенное слово.
    

Screenshot from 2023-02-01 12-05-56

Байт — восемь последовательно расположенных битов.Биты нумеруются от 0 до 7, при этом бит 0 является самым младшим значащим битом. Обратим внимание, байт – наименьшая адресуемая ячейка памяти.


Логическая интерпретация основных типов данных

Целый тип без знака — двоичное значение числа без знака (8, 16 или 32 бита).

Числовые диапазоны:

байт — от 0 до 255;

слово — от 0 до 65 535;

двойное слово — от 0 до 232–1.

Целый тип со знаком — двоичное значение числа со знаком (8, 16 или 32 бита).

Знак содержится в 7, 15 или 31-м бите соответственно.

Отрицательные числа представляются в дополнительном коде.

Числовые диапазоны:

8-разрядное целое — от –128 до +127;

16-разрядное целое — от –32 768 до +32 767;

32-разрядное целое — от –231 до +231–1.

Указатель на память

Указатель на память ближнего типа — 32-разрядный логический адрес, представляющий собой относительное смещение в байтах от начала сегмента.

Указатель на память дальнего типа — 48-разрядный логический адрес, состоящий из двух частей:


В 70-х годах фактически родились две фундаментальные идеи тестирования: тестирование сначала рассматривалось как процесс доказательства работоспособности программы в некото- рых заданных условиях (positive testing5), а затем — строго наоборот: как процесс доказательства неработоспособности программы в некоторых заданных условиях (negative testing). Это вну- треннее противоречие не только не исчезло со временем, но и в наши дни многими авторами совершенно справедливо отмечается как две взаимодополняющие цели тестирования. Отметим, что «процесс доказательства неработоспособности программы» ценится чуть боль- ше, т.к. не позволяет закрывать глаза на обнаруженные проблемы.

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

  • Много «классики тестирования» можно почерпнуть из книги «Искусство тестирова- ния программ» Гленфорда Майерса (издания 1979, 2004, 2011 годов).

Однако большинство критиков отмечает, что эта книга мало подходит для начинающих и куда больше ориентирована на программистов, чем на тестировщиков. Что, впрочем, не умаляет её ценности.

[1]: В оригинале книга называется «The art of software testing» (Glenford J. Myers).

Итак, ещё раз самое важное, что тестирование «приобрело» в 70-е годы: • тестирование позволяет удостовериться, что программа соответствует требованиям; • тестирование позволяет определить условия, при которых программа ведёт себя некор- ректно. В 80-х годах произошло ключевое изменение места тестирования в разработке ПО: вместо одной из финальных стадий создания проекта тестирование стало применяться на протяжении всего цикла разработки (software lifecycle) (также см. описание итерационной инкрементальной модели разработки ПО , что позволило в очень многих случаях не только быстро обнаруживать и устранять проблемы, но даже предсказывать и предотвращать их появление. В этот же период времени отмечено бурное развитие и формализация методологий тестирования и появление первых элементарных попыток автоматизировать тестирование. В 90-х годах произошёл переход от тестирования как такового к более всеобъемлющему процессу, который называется «обеспечение качества (quality assurance )», охватывает весь цикл разработки ПО и затрагивает процессы планирования, проектирования, создания и выполнения тест-кейсов, поддержку имеющихся тест-кейсов и тестовых окружений. Тестирование вышло на качественно новый уровень, который естественным образом привёл к дальнейшему развитию методологий, появлению достаточно мощных инструментов управления процессом тестирования и инструментальных средств автоматизации тестирования, уже вполне похожих на своих нынешних потомков. В 2000 годы нынешнего века развитие тестирования продолжалось в контексте поиска всё новых и новых путей, методологий, техник и подходов к обеспечению качества. Серьёзное влияние на понимание тестирования оказало появление гибких методологий разработки и таких подходов, как «разработка под управлением тестированием (test-driven development , TDD)». Автоматизация тестирования уже воспринималась как обычная неотъемлемая часть большин- ства проектов, а также стали популярны идеи о том, что во главу процесса тестирования следу- ет ставить не соответствие программы требованиям, а её способность предоставить конечному пользователю возможность эффективно решать свои задачи. О современном этапе развития тестирования мы будем говорить на протяжении всего остального материала. Если же отметить вкратце основные характеристики, то получится примерно такой список: гибкие методологии и гибкое тестирование, глубокая интеграция с процессом разработки, широкое использование автоматизации, колоссальный набор технологий и инструментальных средств, кроссфункциональность команды (когда тестировщик и программист во многом могут выполнять работу друг друга).

Что такое тестирование ПО и контроль качества

Тестирование обеспечение качества

Так в чем же различие между этими понятиями и почему тестировщиков часто называют специалистами в сфере QA?

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

Кроме тестирования, QA также включает в себя контроль качества, который отвечает за соблюдение предъявляемых к системе требований. Если представить все три термина в виде иерархии, то тестирование окажется частью QC, а QC – частью QA. Таким образом, тестирование заключается в большей степени в проверке работоспособности программного продукта и поиске дефектов, в то время как для QA важно также обеспечить соблюдение стандартов и предотвратить появление ошибок и багов в ПО.

Обобщим:

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

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

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

В обязанности QA-инженера зачастую входят:

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

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

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

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

По сравнению с QA контроль качества требует больше времени и может быть выполнен только после этапа обеспечения качества.

Чтобы процесс контроля качества прошёл максимально эффективно, на проекте нужно:

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

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

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

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

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

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

Сейчас в большинстве случаев специалисты начинают свою карьеру в IT именно с позиции junior-тестировщика. Это одна из самых лёгких и быстрых точек входа, особенно после прохождения курсов по тестированию ПО. Именно junior-специалисты тестируют разработку по готовым сценариям, в то время как их middle- и senior-коллеги ответственны за разработку планов и тест-кейсов.

Характеристики и модель качества ПО

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

Модель МакКола

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

использование (корректность, надежность, эффективность, целостность, практичность);

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

переносимость (мобильность, возможность многократного использования, функциональная совместимость – факторы качества важные для переносимости программного продукта на другие аппаратные и программные платформы). Факторы качества _________________________________________________ Критерии качества Screenshot from 2023-02-01 12-42-28

Модель Боэма

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

Модель FURPS/FURPS+

Акроним FURPS, используемый в обозначении модели, обозначает следующие категории требований к качеству ПО:

Functionality (Функциональность) /особенности, возможности, безопасность/;

Usability (Практичность) /человеческий фактор, эргономичность, пользовательская документация/;

Reliability (Надежность) /частота отказов, восстановление информации, прогнозируемость/;

Performance (Производительность) /время отклика, пропускная способность, точность, доступность, использование ресурсов/;

Supportability (Эксплуатационная пригодность) /тестируемость, расширяемость, адаптируемость, сопровождаемость, совместимость, конфигурируемость, обслуживаемость, требования к установке, локализуемость/.

Символ «+» расширяет FURPS модель, добавляя к ней:

ограничения проекта (ограничения по ресурсам, требования к языкам и средствам разработки, требования к аппаратному обеспечению);

интерфейс (ограничения накладываемые на взаимодействие с внешними системами);

требования к выполнению,

физические требования,

требования к лицензированию.

FURPS модель качества , предложенная Грейди и Hewlett Packard, построена схожим образом с моделями МакКола и Боэма, но в отличие от них состоит из двух слоев, первый определяет характеристики, а второй связанные с ними атрибуты. Основной концепцией, лежащей в основе FURPS модели качества, является декомпозиция характеристик программного обеспечения на две категории требований, а именно, функциональные (F) и нефункциональные (URPS) требования. Эти выделенные категории могут быть использованы как в качестве требований к программному продукту, так и в оценке качества ПП. В настоящее время модель FURPS+ широко используется в разработке программного обеспечения и при идентификации требований к разрабатываемой системе целесообразно использование FURPS+ модели в качестве универсального контрольного перечня характеристик ПО.

Модель Гецци

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

Модель качества Дроми

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

Модель качества SATC

ВЦентре обеспечения качества программного обеспечения NASA (Software Assurance Technology Center, SATC) была разработана программа метрик , обеспечивающая оценку рисков проекта, качества продукции и эффективности процессов. Программа SATC рекомендует отдельно отслеживать качество требований, качество программного обеспечения и других продуктов (документации), качество тестирования и качество выполнения процессов. Модель качества SATC определяет набор целей, связанных с программным продуктом и атрибуты процессов в соответствии со структурой модели качества программного обеспечения ISO 9126-1.

Модель качества ISO 9126

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

Модель качества ISO 9126-1 различает понятия внутреннего качества, связанного с характеристиками ПО самого по себе, без учета его поведения; внешнего качества, характеризующего ПО с точки зрения его поведения; и качества ПО при использовании в различных контекстах – того качества, которое ощущается пользователями при конкретных сценариях работы ПО. Для всех этих аспектов качества введены метрики, позволяющие оценить их. Кроме того, для создания надежного ПО существенно качество технологических процессов его разработки

Тема 2. Основные понятия и определения.

Необходимые знания и сложности в работе специалиста по тестированию ПО.

какие же технические навыки нужны, чтобы успешно начать работать тестировщиком?

Знание иностранных языков. Да, это нетехнический навык. Но тем не менее он идёт под номером «ноль». Можете считать это аксиомой: «нет знания английского — нет карьеры в IT». Другие иностранные языки тоже приветствуются, но английский первичен

Уверенное владение компьютером на уровне по-настоящему продвинутого пользователя и желание постоянно развиваться в этой области.

Программирование. Оно на порядки упрощает жизнь любому IT’шнику — и тестировщи- ку в первую очередь. Можно ли тестировать без знания программирования? Да, можно. Можно ли это делать по-настоящему хорошо? Нет. И сейчас самый главный (почти религи- озно-философский) вопрос: какой язык программирования изучать? C/C++/C#, Java, PHP, JavaScript, Python, и т.д. — начинайте с того, на чём написан ваш проект. Если проекта пока ещё нет, начинайте с JavaScript (на текущий момент — самое универсальное решение).

Базы данных и язык SQL. Здесь от тестировщика тоже не требуется квалификация на уров- не узких специалистов, но минимальные навыки работы с наиболее распространёнными СУБД и умение писать простые запросы можно считать обязательными

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

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

  1. повышенная ответственность и исполнительность;
  2. хорошие коммуникативные навыки, способность ясно, быстро, чётко выражать свои мысли;
  3. терпение, усидчивость, внимательность к деталям, наблюдательность;
  4. хорошее абстрактное и аналитическое мышление;
  5. способность ставить нестандартные эксперименты, склонность к исследовательской дея- тельности.

Все навыки здесь условно разделены на три группы: • Профессиональные — это именно «тестировщицкие», ключевые навыки, отличающие тес- тировщика от других IT-специалистов. • Технические — это общие навыки в области IT, которыми тем не менее должен обладать и тестировщик. • Личностные — в русском языке термин «soft skills» часто переводят как «навыки межлич- ностного общения», но исходный термин несколько шире.

ПРОФЕССИОНАЛЬНЫЕ НАВЫКИ

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

Работа с документацией

Анализ требований
Умение определять взаимосвязи и взаимозависимость между различными уровнями и формами представления требований, умение формулировать вопросы с целью уточнения неясных моментов
Тестирование требований
Знание свойств хороших требований и наборов требований, умение анализировать требования с целью выявления их недостатков, умение устранять недостатки в требованиях,умение применять техники повышения качества требований
Управление требованиями
Общее понимание процессов выявления, документирования, анализа и модификации требований
Бизнес-анализ
Общее понимание процессов выявления и документирования различных уровней и форм представления требований

Оценка и планирование

Создание плана тестирования
Общее понимание принципов планирования в контексте тестирования, умение использовать готовый тест-план для планирования
собственной работы
Создание стратегии тестирования
Общее понимание принципов построения стратегии тестирования, умение использовать готовую стратегию для планирования собственной работы
Оценка трудозатрат
Общее понимание принципов оценки трудозатрат,умение оценивать собственные трудозатраты при планировании собственной работы

Работа с тест-кейсами

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

Методологии тестирования

Функциональное и доменное тестирование
Знание видов тестирования, твёрдое умение использовать техники и подходы к проектированию тестовых испытаний, умение создавать чек-листы и тест-кейсы, умение создавать отчёты о дефектах
Screenshot from 2023-02-01 14-01-31

Screenshot from 2023-02-01 14-03-07

Screenshot from 2023-02-01 14-09-04

ТЕХНИЧЕСКИЕ НАВЫКИ

Screenshot from 2023-02-01 14-11-11 Screenshot from 2023-02-01 14-11-24 Screenshot from 2023-02-01 14-11-43

Профессиональная терминология. Словарь тестировщика

Андерклокинг — снижение частоты работы оборудования.

Баг (дефект) — недостаток компонента или системы, который может привести к отказу определенной функциональности.

Приоритет багов — важность той или иной ошибки в ПО:

Trivial — косметическая малозаметная проблема.
Minor — очевидная, незначительная проблема.
Major — значительная проблема.
Critical — проблема, нарушающая работу c ключевыми функциями ПО.
Blocker — проблема, нарушающая функционирование ПО.

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

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

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

Система отслеживания ошибок (англ. bug tracking system) — программа учета и/или контроля багов:

Atlassian JIRA
Bugzilla
YouTrack
Redmine
etc.

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

Обеспечение качества (Quality Assurance, QA) — совокупность мероприятий, охватывающих все технологические этапы разработки, выпуска и эксплуатации программного обеспечения

Отладка (англ.Debugging) — процесс, позволяющий получить программное обеспечение, функционирующее с требующимися характеристиками в заданной области входных данных.

Ошибка (англ.Error) – действие, которое порождает неправильный результат.

Сбой (англ.Failure) – несоответствие фактического результата работы компонента или системы ожидаемому результату.

Классификация по типу тестирования:

Мобильное тестирование — тестирование мобильных приложений.

Консольное тестирование — тестирование приложений предназначенных для консолей.

Web-тестирование (Браузерное тестирование) — тестирование браузерных приложений.

Классификация по запуску кода на исполнение: Статическое тестирование (англ.Static testing) — тестирование без запуска кода на исполнение. Динамическое тестирование (англ. Dynamic testing) — тестирование с запуском кода на исполнение.

Классификация по доступу к коду и архитектуре ПО:

Черный ящик (англ. Black box) — тестировщику не известно как устроена тестируемая система. Белый ящик (англ. White box) — тестировщику известно все детали реализации тестируемой системы. Серый ящик (англ. Grey box) — тестировщику известно только некоторые особенности устройства тестируемой системы.

Классификация по степени автоматизации: Ручное тестирование (англ. Manual testing) — тестирование ПО будучи его пользователем. Автоматизированное тестирование (англ. Automated testing) — тестирование ПО при помощи специальных программ.

Классификация по принципу работы с приложением: Позитивное тестирование (англ. Positive testing) — тестирование ПО на то, как оно должно работать. Негативное тестирование (англ. Negative testing) — тестирование ПО на то, как оно не должно работать.

Классификация по уровню детализации приложения: Интеграционное тестирование — тестирование взаимодействия и связей нескольких компонентов приложения. Системное тестирование — это тестирование всего приложения от начала и до конца. Модульное тестирование — тестирование на уровне отдельного функционального компонента приложения.

Классификация по целям и задачам: Функциональное тестирование — проверка корректности работы функциональности приложения.

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

Инсталляционное тестирование — проверка протекания стадии инсталляции (установки) приложения. Регрессионное тестирование — проверка на наличие багов, вызванных изменениями в приложении.

Повторное тестирование — выполнение тест-кейсов, которые ранее обнаружили дефекты, с целью подтверждения устранения дефектов.

Приёмочное тестирование — тестирование, направленное на проверку приложения с точки зрения конечного пользователя/заказчика

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

Тестирование доступности — тестирование, направленное на исследование пригодности продукта к использованию людьми с ограниченными возможностями

Тестирование интерфейса — тестирование, направленное на проверку интерфейсов приложения или его компонентов.

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

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

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

Тестирование совместимости — тестирование, направленное на проверку способности приложения работать в указанном окружении (браузер, мобильное ус-во и т.д.).

Тестирование данных и баз данных — тестирование, направленное на исследование таких характеристик данных, как полнота, непротиворечивость, целостность, структурированность и т.д.

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

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

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

Избыточное тестирование — тестирование приложения со всеми возможными комбинациями всех возможных входных данных во всех возможных условиях выполнения.

Тестирование надёжности — тестирование способности приложения выполнять свои функции в заданных условиях.

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

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

Тестирование производительности — исследование показателей скорости реакции приложения на внешние воздействия при различной по характеру и интенсивности нагрузке.

Нагрузочное тестирование — исследование способности приложения сохранять заданные показатели качества при нагрузке в допустимых пределах и некотором превышении этих пределов/

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

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

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

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

Фокус-тест (англ. Focus test) — тестирование, проводимое с целью получения первичной реакции игроков. Необходимо для оценки удобства использования и того, как продукт принимается целевой аудиторией или сторонними людьми.

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

UX (англ. User eXperience — опыт пользователя) — ощущение, испытываемое пользователем во время использования цифрового продукта.

UI (англ. User Interface — пользовательский интерфейс) — это инструмент, позволяющий осуществлять взаимодействие «пользователь — приложение».

Анализ граничных значений (англ. Boundary Value Analysis — BVA). Анализ граничных значений может быть применен к полям, записям, файлам, или к любого рода сущностям имеющим ограничения.

Дымовое тестирование (англ. Smoke test) — короткий цикл тестов для подтверждения, что после сборки кода (нового или исправленного) приложение стартует и выполняет основные функции.

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

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

Матрица соответствия требований (англ. Traceability matrix) — это двумерная таблица, содержащая соответсвие функциональных требований (functional requirements) продукта и подготовленных тестовых сценариев (test cases).

Операционное тестирование (англ. Release Testing). Даже если система удовлетворяет всем требованиям, важно убедиться в том, что она удовлетворяет нуждам пользователя и выполняет свою роль в среде своей эксплуатации, как это было определено в бизнес модели системы.

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

Причина / Следствие (англ. Cause/Effect — CE). Это, как правило, ввод комбинаций условий (причин), для получения ответа от системы (Следствие).

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

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

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

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

Альфа-тестирование (англ. Alpha testing) — имитация реальной работы с системой штатными разработчиками, либо реальная работа с системой потенциальными пользователями/заказчиком на ранней стадии разработки продукта, но в некоторых случаях может применяться для законченного продукта в качестве внутреннего приёмочного тестирования.

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

Релиз-кандидат или RC (англ. Release candidate), Пре-релиз, иногда «гамма-версия» — стадия-кандидат на то, чтобы стать стабильной.

Релиз или RTM (англ. Release to manufacturing — промышленное издание) — издание продукта, готового к тиражированию.

Пост-релиз или Post-RTM (англ. Post-release to manufacturing) — издание продукта, у которого есть несколько отличий от RTM и помечается как самая первая стадия разработки следующего продукта.

Таблица принятия решений (англ. Decision table) — инструмент для упорядочения сложных бизнес требований, которые должны быть реализованы в продукте.

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

Тест-план (англ. Test Plan) — это документ, описывающий весь объем работ по тестированию, а также оценки рисков с вариантами их разрешения.

Тестирование взаимодействия (англ. Interoperability Testing) — это функциональное тестирование, проверяющее способность приложения взаимодействовать с одним и более компонентами или системами.

Тестирование сборки (англ. Build Verification Test) — тестирование направленное на определение соответствия, выпущенной версии, критериям качества для начала тестирования.

Тестирование пользовательского интерфейса (англ. UI Testing) — тестирование, выполняемое с целью определения, удобен ли некоторый искусственный объект (такой как веб-страница, пользовательский интерфейс или устройство) для его предполагаемого применения.

Тестовый случай (англ. Test Case) — это артефакт, описывающий совокупность шагов, конкретных условий и параметров, необходимых для проверки реализации тестируемой функции или её части.

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

Эквивалентное Разделение (англ. Equivalence Partitioning — EP). Как пример, у вас есть диапазон допустимых значений от 1 до 10, вы должны выбрать одно верное значение внутри интервала, скажем, 5, и одно неверное значение вне интервала — 0.

Z-конфликт (англ. Z-fighting) — наложение текстур друг на друга.

Оверклокинг (англ. Overclocking) — процесс увеличения частоты (и напряжения) компонента компьютера сверх штатных режимов с целью увеличения скорости его работы.

Книги для начинающих тестировщиков

Тестирование Дот Ком

Screenshot from 2023-02-01 14-24-37

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

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

The Self-Taught Software Tester

Чхави Радж Досадж, “The Self-Taught Software Tester A Step By Step Guide to Learn Software Testing Using Real-Life Project”

Screenshot from 2023-02-01 15-39-45

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

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

Software testing Рон Паттон, “Software testing”

Screenshot from 2023-02-01 15-41-51

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

Introducing to Software Testing

Пол Амманн и Джефф Оффатт, “Introducing to Software Testing”

Screenshot from 2023-02-01 15-43-15

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

Тестирование программного обеспечения

Сэм Канер, Джек Фолк, Енг Кек Нгуен, «Тестирование программного обеспечения. Фундаментальные концепции менеджмента бизнес-приложений».

Screenshot from 2023-02-01 15-44-27

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

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

Искусство тестирования программ

Гленфорд Майерс, Том Баджетт, Кори Сандлер, «Искусство тестирования программ»

Screenshot from 2023-02-01 15-48-30

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

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

Complete Guide to Test Automation Арнон Аксельрод, Complete Guide to Test Automation

Screenshot from 2023-02-01 15-49-45

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

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

Идеальное программное обеспечение

Screenshot from 2023-02-01 15-50-54

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

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

A Practitioner’s Guide to Software Test Design

Ли Коупленд, «A Practitioner’s Guide to Software Test Design»

Screenshot from 2023-02-01 15-51-57

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

Managing the Testing Process

Рекс Блэк, “Managing the Testing Process: Practical Tools and Techniques for Managing Hardware and Software Testing”.

Screenshot from 2023-02-01 15-52-56 Хорошая книга для более глубокого понимания управления процессом тестирования, отлично подойдет разработчикам, тестировщикам и менеджерам тестирования. В книге представлено прямое описание того, как нужно правильно управлять процессом тестирования. Рассмотрены роли в этом управлении и его обязанности. В качестве повышения уровня компетенций менеджмента в тестировании, книга очень хороша.

@Stylesproline
Copy link
Author

Понимание принципов работы сетей и операционных систем.
Что такое операционная система

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

Файловая система, планировщик и драйверы – всё это основные инструменты работы ОС.

Существует три ключевых элемента операционной системы:

Абстракции (процессы, потоки, файлы, сокеты, память).
Механизмы (создание, управление, открытие, запись, распределение).
Реализации (алгоритмы LRU, EDF).

Кроме того, есть два основных принципа проектирования операционных систем:

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

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

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

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

Stack: стек процесса содержит временные данные, такие как параметры метода, адрес возврата и локальные переменные.
Heap: это динамически распределяемая память процесса времени его выполнения.
Text: хранит состояние регистров, состояние программного счетчика, режим работы процессора, незавершенные операции ввода-вывода, информацию о выполненных системных вызовах.
Data: раздел содержит глобальные и статические переменные.

Когда процесс выполняется, он проходит через разные состояния. Эти этапы могут различаться в разных операционных системах.

Общая картина выглядит так:

Start: начальное состояние при создании процесса.
Ready: процесс ожидает исполнения на процессоре. В течение работы процессор может переключаться между процессами, переводя одни в режим готовности, другие – в режим исполнения.
Running: выполнение инструкций.
Wait: процесс переходит в состояние ожидания. Например, ждёт ввода данных или получения доступа к файлу.
Terminated: как только процесс завершится, он перейдёт в это состояние и будет ожидать удаления.

Немного терпения: мы уже близки к пониманию того, как работают операционные системы ;)

Блок управления процессов (Process Control Block) – это структура данных, поддерживаемая операционной системой для каждого процесса. PCB имеет идентификатор PID. Именно PCB хранит всю информацию, необходимую для отслеживания процесса.

Screenshot from 2023-02-01 16-00-07

Screenshot from 2023-02-01 16-00-31

Screenshot from 2023-02-01 16-00-56

Process ID: идентификатор каждого из процессов в ОС.
State: текущее состояние процесса.
Privileges: разрешения доступа к системным ресурсам.
Pointer: указатель на родительский процесс.
Priority: приоритет процесса и другая информация, которая требуется для планирования процесса.
Program Counter: указатель на адрес следующей команды, которая должна быть выполнена.
CPU registers: регистры процессора, необходимые для состояния исполнения.
Accounting Information: уровень нагрузки на процессор, статистика и другие данные.
I/O Information: список ресурсов, использующих чтение и запись.

Потоки и параллелизм

Поток (нить, thread) – это ход исполнения программы. Он также имеет свой program counter, переменные, стек.

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

Поток – это легковесный процесс. Вместе они обеспечивают производительность приложений и ОС за счет параллелизма на уровне программы.

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

Чем хороши потоки:

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

Потоки имеют два уровня реализации:

Пользовательский уровень, то есть потоки, управляемые приложениями;
Уровень ядра, то есть потоки, управляемые ядром операционной системы.

В первом случае ядро ​​управления потоками ничего не знает о существовании потоков вообще. А библиотека потоков просто содержит код для создания и уничтожения потоков, а также передачи сообщений и данных между ними для планирования выполнения потоков и сохранения (восстановления) контекстов потоков.

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

Планирование

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

ОС поддерживает все блоки управления процессом (PCB) в очередях планирования процесса:

Очередь задач (job queue) поддерживает все процессы в системе.
Очередь ожидания (ready queue) хранит информацию обо всех процессах, находящихся в основной памяти в состоянии ожидания. В эту очередь попадают и новые процессы.
Очереди из устройств (device queue) – это процессы, заблокированные из-за недоступности устройств ввода-вывода.

ОС может использовать разные методы реализации для управления очередями (FIFO, Round Robin, Priority). Планировщик ОС определяет, когда и как перемещать процессы между готовыми и запущенными очередями (могут иметь только одну запись на ядро ​​процессора в системе). На приведенной выше диаграмме он был объединен с процессором.

Модели состояния делятся на активные и неактивные:

Активные: при создании нового процесса он переходит в класс активных.
Неактивные: процессы, которые не выполняются, а ждут завершения других процессов. Каждая запись в очереди является указателем на конкретный процесс. Очередь реализуется с использованием связанного списка. Использование диспетчера заключается в следующем: когда процесс прерывается, то переносится в очередь ожидания. Если процесс завершен или отменен – он отменяется вовсе.

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

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

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

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

Адресное пространство процесса – набор логических адресов, к которым программа обращается в коде. Например, если используется 32-битная адресация, то допустимые значения варьируются от 0 до 0x7fffffff, то есть 2 Гб виртуальной памяти.

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

Символьные адреса: или по-другому адреса, используемые в исходном коде. Имена переменных, константы и метки инструкций являются основными элементами символического адресного пространства.
Относительные адреса: компилятор преобразует символические адреса в относительные адреса.
Физические адреса: загрузчик генерирует эти адреса в момент загрузки программы в основную память.

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

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

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

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

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

Межпроцессная коммуникация (IPC) – это механизм, который позволяет процессам взаимодействовать друг с другом и синхронизировать действия. Связь между этими процессами может рассматриваться как сотрудничество.

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

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

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

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

Аналогично потребитель сначала проверит наличие товара, и если ни один элемент не будет доступен, придётся ждать его освобождения.
Метод анализа сообщений

С помощью этого метода процессы взаимодействуют друг с другом без использования общей памяти. Допустим, есть два процесса, p1 и p2, которые хотят взаимодействовать друг с другом. Они работают следующим образом:

Устанавливается связь (если её ещё не существует).
Начинается обмен сообщениями с помощью базовых примитивов. Нам нужно как минимум два примитива – отправить (сообщение, пункт назначения) или получить (сообщение).

Размер сообщения может быть фиксированным или переменным. Проектировщикам ОС проще работать с сообщениями фиксированного размера, а программистам – переменного. Стандартное сообщение состоит из двух частей – заголовка и тела.
Управление вводом и выводом

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

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

Блочные: то есть устройства, с которыми драйверы связываются, отправляя целые блоки данных. Например, жесткие диски, USB-камеры, Disk-On-Key.
Символьные: те устройства, с которыми драйвер связывается, отправляя и получая одиночные символы (байты или октеты). Например, последовательные порты, параллельные порты, звуковые карты и так далее.

ЦПУ должен иметь способ передачи информации на устройство ввода-вывода и обратно. И есть три способа сделать это:

Специальные инструкции

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

Входы и выходы с отображением памяти

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

Прямой доступ к памяти (DMA)

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

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

Организация прямого доступа к памяти требует специального оборудования, называемого контроллером DMA (DMAC). Он управляет передачей данных и доступом к системной шине. Контроллеры запрограммированы с указателями источника и места назначения, счетчиками для отслеживания количества переданных байтов и прочими настройками.
Виртуализация

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

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

Физическая машина с гипервизором называется хостом, а виртуальные машины, которые используют ресурсы данного хоста – гостями. Для них ангаром ресурсов являются процессор, память, хранилище. Для получения доступа к этим ресурсам операторы управляют виртуальными экземплярами.

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

Проще говоря, виртуализация создает дополнительные мощности для выполнения процессов.
Типы виртуализации

Данные: позволяет компаниям обеспечивать вычислительные мощности для объединения данных из нескольких источников, размещения новых источников и преобразования данных в соответствии с потребностями пользователя.
Рабочий стол: легко спутать с виртуализацией операционной системы. Виртуализация рабочего стола позволяет центральному администратору одновременно развёртывать смоделированные среды на сотнях физических машин. Виртуальные системы позволяют администраторам выполнять массовые конфигурации, обновления и проверки безопасности на всех устройствах сразу.
Серверы: программная имитация с помощью специального ПО аппаратного обеспечения компьютера: процессор, память, жесткий диск, и т. д. На такой виртуальный компьютер можно установить операционную систему, и она будет на нем работать точно так же, как и на простом, «железном» компьютере. Самое интересное достоинство этой технологии – это возможность запуска нескольких виртуальных компьютеров внутри одного физического. При этом, все виртуальные компьютеры могут работать независимо друг от друга.
Сервер – компьютер, спроектированный под выполнение большого объема специфических задач. Виртуализация сервера позволит ему выполнять больше этих специальных задач, а также разделить функционал на разные компоненты.
ОС: это способ одновременного запуска Linux и Windows-сред. Преимущество в том, что это уменьшает затраты на оборудование, повышает безопасность и экономит время на обслуживании.
Сетевые функции: разделяет ключевые функции сети (например, службы каталогов, общий доступ к файлам и IP-конфигурацию) для распределения между средами. Виртуальные сети сокращают количество физических компонентов: коммутаторов, маршрутизаторов, серверов, кабелей.

Система файловой дистрибуции

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

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

Сетевая файловая система Sun Microsystems (NFS), Novell NetWare, распределенная файловая система Microsoft и DFS от IBM являются примерами распределенных файловых систем.
Распределенная общая память

Распределенная общая память (DSM) – это компонент управления ресурсами распределенной операционной системы. В DSM доступ к данным осуществляется из общего пространства, аналогично способу доступа к виртуальной памяти. Данные перемещаются между дополнительной и основной памятью, а также между разными узлами. Изменения прав собственности происходят, когда данные перемещаются с одного узла на другой.

Преимущества распределенной общей памяти:

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

Облачные вычисления

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

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

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

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

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

@Stylesproline
Copy link
Author

Stylesproline commented Feb 1, 2023

SQL или Structured Query Language (язык структурированных запросов)язык программирования, предназначенный для управления данными в СУБД. Все современные СУБД поддерживают SQL.

На языке SQL выражаются все действия, которые можно провести с данными: от записи и чтения данных, до администрирования самого сервера СУБД. Для повседневной работы совсем не обязательно знать весь этот язык; достаточно ознакомиться лишь с основными понятиями синтаксиса и ключевыми словами.

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

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

Например, чтобы вывести на экран все записи из таблицы города, составим такой запрос:

ПРОЧИТАТЬ всё ИЗ ТАБЛИЦЫ 'города'

Если перевести этот запрос на язык SQL, то корректным результатом будет:

SELECT * FROM 'cities'
Теперь напишем запрос на добавление в таблицу города нового города:

ВСТАВЬ В ТАБЛИЦУ 'города' ЗНАЧЕНИЯ 'имя города' = 'Санкт-Петербург'

Перевод на SQL:

INSERT INTO 'cities' SET 'name' = 'Санкт-Петербург'

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

С помощью SQL можно не только добавлять и читать данные, но и:

удалять и обновлять записи в таблицах;
создавать и редактировать сами таблицы;
производить операции над данными: считать сумму, получать самое большое или малое значение, и так далее;
настраивать работу сервера СУБД.

MySQL

Существует множество различных реляционных СУБД. Самая известная СУБД — это Microsoft Access, входящая в состав офисного пакета приложений Microsoft Office. Нет никаких препятствий для использования в качестве СУБД MS Access, но для задач веб-программирования гораздо лучше подходит альтернативная программа — MySQL.

Оператор SQL create database: создание новой базы данных>

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

Начать следует с создания новой базы данных для нашего сайта. Новая БД в MySQL создаётся простой командой:

CREATE DATABASE <имя базы данных>

После этого MySQL создаст для нас новую БД, в которой будет происходить вся дальнейшая работа. Это важно: после создания БД её невозможно будет переименовать, а только удалить и создать заново. По этой причине крайне внимательно подойдите к выбору имени для базы данных.
create table

Зачем нужен: создание таблиц

Создав новую БД, сообщим MySQL, что теперь мы собираемся работать именно с ней. Выбор активной БД выполняется командой:

USE <имя базы>;

Пришло время создать первые таблицы! Для ведения дневника по всем правилам, понадобится создать три таблицы: города (cities), пользователи (users) и записи о погоде weather_log. В подразделе «Запись» этой главы описано, как должна выглядеть структура таблицы weather_log. Переведём это описание на язык SQL:

CREATE TABLE weather_log (
  id INT AUTO_INCREMENT PRIMARY KEY,
  city_id INT,
  day DATE,
  temperature INT,
  cloud TINYINT DEFAULT 0
);

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

Теперь создадим таблицу городов:

CREATE TABLE cities (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name CHAR(128)
)

MySQL может показать созданную таблицу, если попросить об этом командой:

SHOW COLUMNS FROM weather_log

В ответе будут перечислены все поля таблицы, их тип и другие характеристики.

Что такое первичный ключ

В примере с созданием новой таблицы при перечислении необходимых полей первым полем идёт id INT AUTO_INCREMENT PRIMARY KEY. Это поле называется первичным ключом. Обязательно создавать первичный ключ в каждой таблице.

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

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

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

insert into

Зачем нужен: добавление записи в таблицу

Начнём с добавления новых данных в таблицу. Для добавления записи используется следующий синтаксис:

insert into <название таблицы> set <имя столбца1> = <значение2>, <имя столбца2> = <значение2>...

В начале добавим город в таблицу городов:
insert into cities set name ='Санкт-Петербург'``
При добавлении записи необязательно указывать значения для всех полей. Многие из полей имеют значения по умолчанию, которые сами заполняются при сохранении.

Теперь создадим запись о погоде за сегодня.

При определении таблицы weatherlog мы решили ссылаться на город, путём записи в поле cityid идентификатора города из таблицы cities. Так как мы только что добавили новый город, ничего не мешает использовать его идентификатор в записи о погоде.

Идентификатором города будет первичный ключ, который также был определён в качестве первого поля таблицы. Нумерация этого поля начинается с единицы, значит первая добавленная запись имеет идентификатор 1. Зная это, запрос на добавление записи о погоде в Санкт-Петербурге за третье сентября 2017 года выглядит так:

INSERT INTO weather_log SET city_id = 1, day = '2017-09-03', temperature = 5, cloud = 1;

select. Чтение информации из БД

Для вывода информации из БД используются запросы типа SELECT.

В запросе нужно указать имя таблицы, необходимые поля, а также дополнительные параметры

SELECT <перечисление полей> FROM <имя таблицы>

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

SELECT id, name FROM cities

Все погодные записи:

SELECT id, day, city_id, temperature, cloud FROM weather_log

Вместо перечисления всех столбцов можно использовать знак звездочки — *.

Оператор update: обновление информации в БД

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

Предположим, что при добавлении погодной записи пользователь ошибся и ввёл неверную дату. Чтобы исправить эту ошибку, нужно использовать оператор обновления — UPDATE. Запрос с этим оператором позволяет обновить значение одного или нескольких полей в существующей записи. Выглядит он так:

UPDATE <имя таблицы> SET <имя столбца1> = <значение2>, <имя столбца2> = <значение2>... WHERE <имя столбца> = <значение>

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

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

Запрос на обновление:

UPDATE weather_log SET day = '2022-12-07' WHERE id = 1

Оператор join: объединение записей из двух таблиц

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

Поменяем запрос на показ погодных записей, чтобы он объединял две таблицы, а в поле города показывалось его название, а не идентификатор:

SELECT day, cities.name, temperature, cloud FROM weather_log JOIN cities ON weather_log.city_id = cities.id

Важно усвоить три самых главных момента:

При чтении из объединённых таблиц, в перечислении полей после SELECT нужно явно указывать в поле имени также имя таблицы, с которой производится объединение.
Всегда есть основная таблица (тб1), из которой читается большинство полей, и присоединяемая (тб2), имя которой определяется после оператора JOIN.
Помимо указания имени второй таблицы, обязательно следует указать условие, по которому будет происходить объединение. В этом примере таким условием будет соответствие идентификатора города из тб1 (weather_log.city_id) первичному ключу города из тб2 (cities.id).

@Stylesproline
Copy link
Author

Stylesproline commented Feb 1, 2023

Что такое веб-приложение?

Понимание принципов работы веб-приложений и мобильных приложений

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

Чем веб-приложения отличаются от веб-сайтов?

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

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

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

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

Подытожим основные различия между веб-приложением и веб-сайтом:

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

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

Примерами веб-приложений служат:

интернет-почта (Gmail);
текстовые редакторы («Google Документы»);
социальные сети (Facebook);
магазины электронной коммерции (Amazon);
облачные хранилища (Dropbox);
онлайн-заметки (Evernote);
системы управления проектами (Trello);
и многие другие приложения, которыми вы, несомненно, пользуетесь.

Преимущества веб-приложений

Веб-приложение обладает многими преимуществами, в том числе перечисленными ниже.

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

Архитектура веб-приложения

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

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

Веб-приложения с использованием AJAX

При первом запросе к странице передается HTML-код каркаса. Код JavaScript асинхронно подгружает остальные фрагменты страницы и может «на лету» отправлять запросы на сервер и обрабатывать его ответы в формате XML (eXtended Markup Language) или JSON (JavaScript Object Notation)
Клиентские приложения

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

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

Для создания одностраничных веб-приложений используются такие фреймворки, как, например, Ember.js, Angular, React, Backbone.js и Vue.js

Клиентские приложения

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

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

Для создания одностраничных веб-приложений используются такие фреймворки, как, например, Ember.js, Angular, React, Backbone.js и Vue.js.
Прогрессивные веб-приложения

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

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

Они обладают следующими характеристиками:

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

Принципы работы веб-приложений

Веб-приложения состоят из серверной части (back-end, бэкенд) и клиентской части (front-end, фронтенд). Пользователи взаимодействуют с клиентской частью через интерфейс, который отображается в браузере (Chrome, Firefox, Safari, Edge и др.). По команде пользователя запрос отправляется на сервер через интернет. На сервере его обрабатывает серверный код и возвращает клиенту ответ.

Screenshot from 2023-02-01 16-38-02

В ответе может содержаться как готовая HTML-страница, так и шаблон страницы или данные, например в формате XML или JSON. Это зависит от выбранного типа рендеринга (формирования) страницы. То есть, страница может отправляться вообще без изменений (статическая страница) или же бэкенд вносит в нее изменения, после чего отправляет ее браузеру (динамическая страница). Рендеринг может производиться либо полностью на сервере, либо в разных соотношениях распределяться между сервером и клиентом, либо выполняться только клиентом.

Статические и динамические страницы

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

Клиент отправляет серверу навигационный запрос. В ответ на этот запрос сервер передает клиенту статическую веб-страницу без изменений. Весь ее контент (текст, изображения и т.д.) каждый раз выводится одинаково. Этот контент «жестко» закодирован в самой странице.

Вот пример статической веб-страницы:

<!DOCTYPE html>
<html>
    <head>
        <title>Домашняя страница</title>
    </head>
    <body>
        <h1>Домашняя страница</h1>
        <hr>
        <div>
            <span><b>Домашняя</b></span>
            <span><a href="products.html">Продукты</a></span>
            <span><a href="about.html">О сайте</a></span>
        </div>
        <hr>
        <p>Добро пожаловать в статический мир!</p>
    </body>
</html>

Она будет выглядеть примерно так:

Screenshot from 2023-02-01 16-42-10


<!DOCTYPE html>
<html>
    <head>
        <title>О сайте</title>
    </head>
    <body>
        <h1>О сайте</h1>
        <hr>
        <div>
            <span><a href="home.html">Домашняя</a></span>
            <span><a href="products.html">Продукты</a></span>
            <span><b>О сайте</b></span>
        </div>
        <hr>
        <p>Это статический сайт.</p>
    </body>
</html>

Как видим, большая часть кода не изменилась. Изменился текст и оформление меню: жирным выделена страница «О сайте», а «Домашняя» теперь — ссылка. Эти изменения вносились вручную.

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

Screenshot from 2023-02-01 16-40-57

Бэкенд

В 1993 году появилась спецификация Common Gateway Interface (CGI). Это интерфейс, который используется программой для связи с веб-сервером. Такая программа называется шлюзом. Шлюз может быть написан на любом языке программирования, который использует стандартный ввод-вывод: C/C++, Fortran, PERL, TCL, любая оболочка Unix (shell), Visual Basic, AppleScript. На практике большинство сценариев было написано на Perl.

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

В 1995 году с возникновением JavaScript появилась возможность реагировать на действия пользователя мгновенно и открывать всплывающие окна. Веб-страницы оживились. В этом же году был создан язык PHP. Он позволял объединять HTML-код с логикой.

Для простоты на PHP наши страницы можно было бы представить так:

<!DOCTYPE html>
<html>
    <head>
        <title><?php echo $title ?></title>
    </head>
    <body>
        <h1><?php echo $title ?></h1>
        <hr>
        <div>
            <?php
            $i = 0;
            foreach($menu as $menu_item) {
                if($menu_item == $current){
            ?>
<span><b><?php echo $menu_item ?></b></span>
            <?php
                }else{
            ?>
<span><a href="<?php echo $menu_links[$i] ?>"><?php echo $menu_item ?></a></span>
            <?php
                   
                }
                $i++;
            }
?>
 
        </div>
        <hr>
        <p>Добро пожаловать в динамический мир!</p>
    </body>
</html>
``

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

Для домашней страницы он дает такой выходной код HTML:

<title>Домашняя страница</title>

Домашняя страница


Домашняя Продукты О сайте
    </div>
    <hr>
    <p>Добро пожаловать в динамический мир!</p>
</body>
`

И получаем нужный результат:

Screenshot from 2023-02-01 17-09-38


Выгода — не приходится создавать каждую страницу отдельно. Один и тот же код выполняет рендеринг любой страницы. Такой рендеринг называется серверным рендерингом (server-side rendering, SSR). Сервер обрабатывает запрос, формирует страницу из шаблона, а клиент получает готовую полнофункциональную HTML-страницу.

Сейчас для написания кода бэкенда используется множество языков и специальных фреймворков. Самые популярные — это Java (с использованием Java Servlet API), PHP + Laravel, Python + Django, Node.js, языки платформы .NET (C#, VB) + ASP.NET, Ruby + Ruby on Rails и Go. Выбор конкретного языка и фреймворка зависит от характера решаемых задач.

Доступ к базе данных

Список продуктов с информацией о них может храниться в базе данных (БД). С ней взаимодействует серверный код. Он может читать данные из базы, добавлять, изменять или удалять их. В качестве системы управления базой данных используются MySQL, PostgreSQL, Memcached, MongoDB, Redis и другие. Для работы с БД существует множество библиотек, ориентированных на различные серверные языки программирования.

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

Фронтенд

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

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

Фронтенд может содержать информационные блоки и элементы управления. Например, в Facebook информационные блоки — это публикации в ленте, истории, рекомендации, а элементы управления — кнопки вкладок, меню, ссылки, поля поиска и ввода контента для публикации, комментариев и т. д.



Если же взять, к примеру, Google Docs, то видим, в основном, следующие элементы управления: меню, панель инструментов, панель структуры, документ. Информационный блок здесь — это справка. В целом же это интерактивный интерфейс.

Интерактивность обеспечивается за счет JavaScript-кода, который выполняется в браузере. Для сложных приложений используются специальные библиотеки, упрощающие написание кода. Например, Google Docs и многие другие веб-приложения Google используют библиотеку [Closure Library](https://developers.google.com/closure/library), Facebook — библиотеку React. Библиотека Redux применяется для управления состоянием приложения и часто используется с React. Широко используются такие библиотеки для веб-приложений, как Angular,  Ember.js, Express.js (в паре с Node.js), Vue.js.




Благодаря использованию этих библиотек можно использовать клиентский рендеринг (client-side rendering, CSR). В одностраничном приложении рендеринг, логика и загрузка возлагаются на клиентскую сторону.

Например, с использованием Vue.js рендеринг осуществляется следующим образом. В файле index.html
указываем переменную

`hello`

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <div id="hello">
        {{ hello }}
    </div>
   
    <script src="index.js"></script>
</body>
``` : В файле index.js указываем, что подставлять вместо переменной hello :

В файле index.js
указываем, что подставлять вместо переменной hello
:

var app = new Vue({
    el: '#hello',
    data: {
        hello: 'Рендеринг на стороне клиента!'
    }
});

Вывод в браузере:

Screenshot from 2023-02-01 17-13-28

Предварительная обработка HTML-файла не производится. Клиент подставляет контент вместо переменных во время выполнения сценария.

@Stylesproline
Copy link
Author

Stylesproline commented Feb 1, 2023

**Основные принципы тестирования мобильных приложений

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

Поэтому приложение надо тестировать еще на этапе разработки.

Основные принципы тестирования мобильных приложений

Функциональное тестирование

Functional testing используется для проверки корректного взаимодействия приложения с пользователем.

На этом этапе проверяется:

корректность работы обязательных полей, отклик на действие (при нажатии на кнопки);
исправность работы программы при установке, запуске и выходе;
исправная работа программы при входящих звонках, SMS-сообщениях (можно ли их принять, отправить смс);
возможность работы на смартфоне/планшете в многозадачном режиме;
работа с соцсетями – можно ли зарегистрироваться через социальную сеть, перейти в соцсеть и т. д.
поддержка платежных операций через различные системы оплаты;
наличие плейсхолдеров (подсказок и уведомлений об ошибках) в случае проблем с сетью;
корректная работа программы в комплексе с другими приложениями;
способность вернуться в исходное перед приостановкой состояние (после сбоя в системе или перезагрузки гаджета);
беспроблемная установка и соответствие программы системным требованиям;
корректность автоматического запуска программы;
корректность работы мобильного приложения на смартфонах и планшетах с типами связи 2G, 3G и 4G.

Тестирование производительности

Performance testing - автоматизированная проверка, имитирующая работу большого количества пользователей.

Здесь важно выяснить:

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

Тестирование безопасности

Используется для [тестирования] безопасности системы и данных приложения.

На этом этапе необходимо:

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

Юзабилити тестирование

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

Для этого важно:

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

Конфигурационное тестирование

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

На этом этапе важно убедиться:

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

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

Проверяется способность приложения к восстановлению после возможных сбоев. Такую проверку необходимо проводить для приложений, работающих 24/7.

В первую очередь проверяется:

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

Случайное тестирование («monkey» testing)

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

Оценивается корректность работы приложения:

при хаотичном нажатии разных кнопок;
при быстром открытии-закрытии приложения;
при отмене загрузки данных.

После тестирования и устранения имеющихся ошибок наступает этап предрелизного тестирования. После этого этапа проверки мобильное приложение готово к публикации в магазинах App Store и Google Play

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment