Тестировщик ПО. Минимальный пакет знаний для трудоустройства

image

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

I) Прочитать и понять эту книгу Роман Савин. Тестирование Дот Ком;
II) Разобраться с SQL — запросами;
III) Разослать резюме;
IV) Показать свои знания и адекватность на собеседовании.

Теперь подробнее.


I) Прочитать и понять книгу


В книге около 300 страниц. За 1-2 дня прочитать несложно. Для тех, у кого нет времени на чтение, попробую изложить коротко основные моменты. Но рекомендую прочитать её полностью.

Участники разработки ПО:
1. Менеджер проекта — специалист, занимающийся вопросами поиска заказчиков проектов и исполнителей
2. QA-инженер — специалист, задача которого организовать процесс разработки таким образом, чтобы работа была выполнена в срок и на надлежащем уровне качества.
3. Продюсер — специалист, задача которого составить спецификацию (spec)
4. Программист — специалист, занимающийся написанием или корректировкой кода программы
5. Тестировщик — специалист, занимающийся поиском багов

Цикл разработки ПО состоит из:
1. Идея.
2. Разработка дизайна продукта и создание документации.
3. Кодирование или создание кода.
4. Исполнение тестирования и ремонт багов.
5. Релиз.

Цикл тестирования ПО состоит из трех этапов:
1. Изучение и анализ предмета тестирования.
2. Планирование тестирования.
3. Исполнение тестирования.

Основные понятия:

1. Тестирование — это сравнение фактического результата с ожидаемым.
2. Цели тестирования — нахождение багов до того, как их найдут пользователи.
3. Баг (bug) — это отклонение фактического результата от ожидаемого.
4. Спецификация (spec) — это детальное описание того, как должно работать ПО. Так же, это детальное описание ожидаемого результата. (В спецификации тоже могут быть баги, например, двусмысленные предложения).
5. Тест-кейс — это инструмент тестировщика, предназначенный для документирования и проверки одного или более ожидаемых результатов.
6. Тест-комплект — совокупность тест-кейсов находящихся, как правило, в одном документе, которые проверяют какую-то определенную часть нашего проекта.
7. Шаги тест-кейса (procedure) — это часть тест-кейса, ведущая исполнителя тест-кейса к фактическому результату. (Излишняя детализация может осложнить поддержку, а излишнее абстрагирование привести к непониманию того, как исполнить тест-кейс).
8. Front end — это непосредственный интерфейс пользователя (текст, картинки, кнопки, линки и прочие вещи, которые видно в окне приложения)
9. Back end — это то что на заднем фоне приложения (веб-сервер, код приложения, база данных и т.д.).
10. New feature testing — тестирование новых компонентов.
11. Regression testing — исполнение старых тест-кейсов для проверки того, что старые компоненты ПО еще работают.
12. СТБ (Bug Tracking System) — Система в которую заносятся баги.
13. Git — распределённая система управления версиями файлов (для управления коллекцией исправлений, патчей).

Виды тестирования:

1. По знанию внутренностей системы:
• черный ящик (black box testing) — тестирование программы без доступа к коду;
• белый ящик (white box testing) — тестирование программы только по коду;
• серый ящик (grey box testing) — тестирование без кода+тестирование по коду.

2. По объекту тестирования:
• функциональное тестирование (functional testing) — например, проверка выводимого результата;
• тестирование интерфейса пользователя (UI testing) — из названия понятно;
• тестирование локализации (localization testing) — например, проверка шрифтов и другая адаптация приложения для пользователей;
• тестирование скорости и надежности (load/stress/performance testing) — например, проверка скорости загрузки сайта при определенном количестве пользователей;
• тестирование безопасности (security testing) — суть в том, чтобы усложнить условия для кражи данных (например телефонов и др. личной информации);
• тестирование опыта пользователя (usability testing) — суть в том, чтобы интерфейс был интуитивно понятен даже непродвинутым пользователям;
• тестирование совместимости (compatibility testing) — запуск на разных операционках и браузерах.

3. По субъекту тестирования:
• альфа-тестировщик (alpha tester) — тестирование сотрудниками фирмы;
• бета-тестировщик (beta tester) — тестирование пользователями.

4. По важности тестирования:
• сначала тестирование новых функциональностей (new feature testing) — тестирование новых функциональностей;
• потом регрессивное тестирование (regression testing) — повторное тестирование старых функций.

5. По критерию «позитивности»сценариев:
• позитивное тестирование (positive testing) — тестируем ожидаемыми методами;
• негативное тестирование (negative testing) — тестируем нестандартными методами(например вводим вместо 9 цифр — 11 букв).

6. По степени изолированности тестируемых компонентов:
• компонентное тестирование (component testing) — это тестирование одного логического компонента;
• интеграционное тестирование (integration testing) — это тестирование на уровне двух или больше логических компонентов;
• системное тестирование (system or end- to-end testing) — это проверка всей системы от начала до конца.

7. По степени автоматизированности тестирования:
• ручное тестирование (manual testing) — это исполнение тест-кейсов без помощи каких-либо программ, автоматизирующих вашу работу (например, создаем аккаунт вручную);
• автоматизированное тестирование (automated testing)- акаунт создается программой автоматически;
• смешанное/полуавтоматизированное тестирование (semi automated testing) — создаем акаунт вручную, но закупки сделаются автоматически.

8. По степени подготовки к тестированию:
• тестирование по документации (formal/documented testing) — тестирование по тест-кейсам;
• эд хок-тестирование (ad hoc testing) — интуитивное тестирование без документации (например, когда что-то нужно быстро проверить).

Пример тест-кейса:

image

Также по документам существует:
• Тест-смета (Test Estimation) — документ, включающий в себя предварительную оценку времени, необходимого на подготовку к тестированию и на тестирование новых фича (new feature testing);
• Тест-план (test-plan) — документ, обобщающий и координирующий тестирование (подробнее об этом документе можно узнать в книге Савина).


II) Разобраться с SQL запросами


SQL (structured query language) — структурированный язык запросов.
С помощью SQL- запросов можно создавать и работать с реляционными базами данных.
Реляционная база данных — это таблица, в которой в качестве столбцов выступают поля данных, а каждая строка хранит данные.

SQL определяется Американским Национальным Институтом Стандартов и Международной Организацией по стандартизации (ISO)
Несмотря на это, некоторые производители баз данных вносят изменения и дополнения в этот язык. Эти изменения незначительны и основа остаётся совместимой со стандартом. (например ms sql, my sql, postgreSQL).

В каждой таблице должно быть одно уникальное поле, которое однозначно будет идентифицировать строку. Это поле назовем ключевым (Key1, Key2..).
В качестве ключа обычно используют численный тип и если позволяет база данных, то он будет типа «autoincrement» (автоматически увеличивающееся).

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

SQL может быть двух типов: интерактивный и вложенный. Интерактивный — это отдельный язык, он сам выполняет запросы и сразу показывает результат работы. Второй — это когда SQL язык вложен в другой, например в С++ или Delphi.

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

Представим, что у нас есть две таблицы:

Prog.db
Key1 / ProgName / Cost
1 / Windows 95 / 100
2 / Windows 98 / 120

и

User.db
Key1 / Key2 / LastName
1 / 1 / Иванов
2 / 1 / Петров
3 / 2 / Сидоров

Рассмотрим первый запрос:

SELECT *
FROM Prog, User
WHERE Prog.Key1= Key2
AND ProgName LIKE ‘Windows 95′

Выбрать (SELECT) все поля (*) из (FROM) баз данных Prog и User, где (WHERE) есть связь(Prog.Key1 и Key2) Prog.Key1= Key2 и ProgName LIKE ‘Windows 95′.
LIKE это тоже самое что равно(=) только для строк

Результатом этого запроса будет:

Prog.db User.db
Key1 / ProgName / Cost / Key1 / Key2 / LastName
1 / Windows 95 / 100 / 1 / 1 / Иванов
1 / Windows 95 / 100 / 2 / 1 / Петров

Отредактируем немного запрос:
SELECT Prog.Key1, Prog.ProgName, Prog.Cost*2 ‘руб’,
Cost.Key1, Cost.Key2, Cost.LastName
FROM Prog, User
WHERE Prog.Key1= Key2

Prog.Cost*2 ‘руб’ — эта запись говорит, что к каждое значение надо умножить на 2 и прибавить строку ‘руб’.

Результат:
Prog.db User.db
Key1 / ProgName / Cost / Key1 / Key2 / LastName
1 / Windows 95 / 200 руб / 1 / 1 / Иванов
1 / Windows 95 / 200 руб / 2 / 1 / Петров

Для сортировки используется команда ORDER BY. После этого пишутся поля, по которым надо отсортировать. В самом конце нужно поставить АSC (сортировать в порядке возрастания) или DESC (в порядке убывания). Если ты не ставишь АSC или DESC, то таблица сортируется по возрастанию и подразумевается параметр АSC.

Например:
SELECT *
FROM Prog
ORDER BY ProgName DESC

Результатом будет таблица Prog, отсортированная по полю ProgNamе в порядке убывания.

SQL калькулятор:
Вот несколько функций:
• COUNT — подсчёт количества строк;
• SUM — подсчёт суммы;
• AVG — подсчёт среднего значения;
• MAX — поиск максимального значения;
• MIN — поиск минимального значения.

Этот запрос просто подсчитывает количество строк в базе:
SELECT COUNT(LecNumber)
FROM User

Этот запрос опять подсчитывает количество строк, но теперь результатом будет количество народу, у которых поле LecNumber = 1:
SELECT COUNT(LecNumber)
FROM User
WHERE LecNumber=1

Этот запрос выводит количество лицензий и единицу измерения в одном столбце. Здесь к числу прибавляется текст:
SELECT LecNumber+’шт.’
FROM User

Объединения:
Представим, что у нас есть две таблицы User1 и User2:
User1.db
Key1/OC/ LastName
1 / Win/ Иванов
2 /Unix/ Петров
3 /Win/ Яковлев
4 /Win/ Сидоров
5 /Win/ Ковалёв
6 /Unix/ Амаров

User2.db
Key1/OC/ LastName
2 /Unix/ Богров
3 /Win/ Сидоров
4 /OS2/ Ковалёв

Мы хотим получить список всех пользователей Unix из двух таблиц сразу. Для этого нужно выполнить запрос выбора к первой таблице, а потом ко второй. Результатом будет две выходные таблицы. А если мы хотим получить одну? Для этого можно воспользоваться объединением — оператор UNION. Вот как это будет выглядеть:

SELECT *
FROM User1.db
WHERE OC LIKE ‘Unix’
UNION
SELECT *
FROM User2.db
WHERE OC LIKE ‘Unix’;

Результатом будет таблица:

User1.db
Key1 / OC / LastName
2 /Unix/ Петров
6 /Unix/ Амаров
2 /Unix/ Богров

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

Если одного поля в одном из запросов нет, то его можно заменить. Например:

SELECT Key1, OC, LastName
FROM User1.db
WHERE OC LIKE ‘Unix’
UNION
SELECT Key1, OC, ‘NO FOUND’
FROM User2.db
WHERE OC LIKE ‘Unix’;

Результат:

User1.db
Key1 / OC / LastName
2 /Unix/ Петров
6 /Unix/ Амаров
2 /Unix/ NO NAME

Здесь мы вместо поля LastName подсовываем текст ‘NO FOUND’, чтобы количество и тип полей совпадали.

Упорядочим наш вывод:

SELECT Key1, OC, LastName, ‘Table 1′
FROM User1.db
WHERE OC LIKE ‘Unix’
UNION
SELECT Key1, OC, ‘NO FOUND’, ‘Table 2′
13
FROM User2.db
WHERE OC LIKE ‘Unix’;
ORDER BY 3

Результат:

User1.db
Key1/ OC / LastName
2 /Unix /NO NAME Table 2
6 /Unix /Амаров Table 1
2 /Unix /Петров Table 1

Запросы с подзапросами:
SQL позволяет вставлять одни запросы внутрь других.

SELECT *
FROM User1.db
WHERE Key2 =
(SELECT Key1 FROM Prog
WHERE ProgName LIKE ‘MyProg.exe’);

Сначала SQL выполнит внутренний запрос, который расположен в скобках и результат подставит во внешний запрос.
Тут должно выполнятся два условия: у внутреннего запроса, в качестве результата должен быть только один столбец. Это значит, что мы не можем написать во внутреннем запросе SELECT *, а можно только SELECT ИмяОдногоПоля. Помним, что имя должно быть только одно и тип его должен совпадать с типом сравниваемого значения.

Для большей надёжности можно использовать с подзапросом оператор DISTINCT. Единственный случай, когда подзапрос может выдавать в результате несколько строк, это когда в основном запросе используется оператор IN:

SELECT *
FROM User1.db
WHERE Key2 IN
(SELECT Key1 FROM Prog
WHERE ProgName LIKE ‘MyProg.exe’);

Здесь, вместо знака равно мы использовали оператор IN (key2 IN (подзапрос)). Так что для надёжности запроса можно использовать не только DISTINCT, но и оператор IN. Это желательно делать даже в тех случаях, когда мы уверены, что результатом будет только одна строка.

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

SELECT *
FROM User1.db outer
WHERE Key2 =
(SELECT Key1
FROM Prog inner
WHERE key1 = outer.Key2);

Слова outer и inner — псевдонимы, которые назначаются таблицам user1 и prog соответственно. Это значит, что когда мы пишем outer, это то же самое, что и написать User1. Такой запрос будет выполнятся по следующему алгоритму:

• Выбрать строку из таблицы User1.db в внешнем запросе. Это будет текущая строка- кандидат.

• Сохранить значения из этой строки-кандидата в псевдониме с именем outer.

• Выполнить подзапрос. Везде, где псевдоним данный для внешнего запроса найден (в этом случае «outer»), использовать значение для текущей строки-кандидата. key1 = outer.Key2. Использование значения из строки — кандидата внешнего запроса в подзапросе называется — внешней ссылкой.

• Оценить предикат внешнего запроса на основе результатов подзапроса выполняемого в предыдущем шаге. Он определяет — выбирается ли строка-кандидат для вывода.

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

Ещё несколько операторов:
1) Оператор EXISTS. Это простая проверка на существование. Этот оператор относится к выражениям Булиан.

разу рассмотрим пример:

SELECT cnum, cname, city
FROM User1
WHERE EXISTS
( SELECT *
FROM User2
WHERE OC = “Unix” );

Это не подзапрос, потому что он выполняется только один раз. Внутренний запрос выбирает все записи, где ОС равна “Unix”. Оператор EXISTS проверяет, если был какой-то результат, то генерирует True, а значит выполниться условие EXISTS. После этого выполнится внешний запрос:

SELECT cnum, cname, city
FROM User1

Так как EXISTS Булиан оператор, его можно использовать с другими Булианами. Вот тебе пример с NOT:
SELECT cnum, cname, city
FROM User1
WHERE EXISTS
( SELECT *
FROM User2
WHERE OC = “Unix” );
В этом случае внешний запрос выполнится только если внутренний не выведет ни одной строки.

Теперь рассмотрим операторы ANY, SOME, и ALL. Первые два оператора абсолютно одинаковы.

SELECT cnum, cname, city
FROM User1
16
WHERE ОC=ANY
( SELECT OC
FROM User2 );

Здесь сначала выполняется внутренний запрос, выбирая все OC из базы User2. Затем выполняется внешний запрос, который выберет все строки, где встретилась любая (ANY) из ОС внутреннего запроса. То есть, результатом будут все строки из User1, в которых встречаются ОС такие же как и в User2.

Теперь познакомится с ALL:

SELECT cnum, cname, city
FROM User1
WHERE NumberLesens>ALL
( SELECT NumberLesens
FROM User2
);

Результатом этого запроса будут все строки, в которых количество лицензий (NumberLesens) больше, чем у всех из таблицы User2.

Работа с полями:
NSERT (вставить), UPDATE (модифицировать), DELETE (удалить).
После оператора VALUES идёт перечисление всех полей строки. Теперь рассмотрим пример:
INSERT INTO User1
VALUES (‘Иванов’, ‘Сергей’, 34);

Этой командой мы вставили строку и присвоили значения полям. В таблице три поля: первые два поля строковые (Фамилия и Имя), последнее поле — целое число (возраст). Типы данных обязаны совпадать с теми, что установлены в таблице.

Если не надо задавать все поля, тогда можно оставить их пустыми с помощью NULL:
INSERT INTO User1
VALUES (‘Иванов’, NULL, 34);

Если таблица с большим количеством полей и нужно заполнить только два из них?
Решение:

INSERT INTO User1 (Family, Age)
VALUES (‘Иванов’, 35);

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

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

INSERT INTO User1
SELECT *
FROM User2
WHERE Age=10

В этом примере сначала выполнится запрос SELECT:

SELECT *
FROM User2
WHERE Age=10

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

Теперь рассмотрим такой запрос:

INSERT INTO User1(Name,Age)
SELECT Name,Age
FROM User2
WHERE Age=10

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

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

UPDATE User1
SET age=65

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

Если нужно обновить только определённые строки, то ты должен написать так:
UPDATE User1
SET age=65
WHERE Name LIKE ‘Вася’

или

UPDATE User1
SET age=age+1

или

UPDATE User1
SET age=age+1, Name=’Иван’
WHERE Family LIKE ‘Сидоров’

Этот запрос увеличит поле Age на единицу и установит поле Name в «Иван» во всех строках, где поле Family равно «Сидоров».

Теперь команда DELETE:

DELETE FROM User1

Эта конструкция удаляет абсолютно все строки из таблицы User1. Можно сказать, что этим мы очищаем таблицу.

Теперь рассмотрим другой пример:

DELETE FROM User1
WHERE Age=10

Этот пример удаляет только те строки, в которых поле Age равно 10.

Создание, изменение и удаление таблиц:

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

CREATE TABLE
( <Имя столбца > <Тип> [(<Размер>)],
<Имя столбца > <Тип> [(<Размер>)]… );

Обрати внимание, что <Размер> показан в квадратных скобках, потому что не все типы данных требуют указания размера поля.

Виды типов данных:

• CHAR или CHARACTER — строковое поле. В качестве размера используется длина строки.

• DEC или DECIMAL — Десятичное число, т.е. число с дробной частью. Размер состоит из двух частей — точность и масштаб. Эти параметры нужно указывать через запятую. Точность показывает сколько значащих цифр имеет число. Масштаб показывает количество знаков после запятой. Если масштаб равен нулю, то число становится эквивалентом целого.

• NUMERIC — Такое же как DECIMAL. Разница только в том, что максимальное десятичное не может превышать аргумента точности.

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

• REAL — то же, что и FLOAT, только размер не указывается, а берётся из системы по умолчанию.

• DOUBLE — то же, что и REAL, только размер побольше (чаще всего в два раза).

• INT или INTEGER — целое число. Размер указывать не надо, он подставляется
автоматически.

• SMALLINT — то же, что и INTEGER, только его размер меньше. В большинстве
случаев, если точность INTEGER равна 2 байтам, то точность SMALLINT равна 1 байту.

CREATE TABLE NovayaTablica
(id integer,
name char (10),
city char (10),
Metr declmal);
Этот запрос создаёт таблицу с именем NovayaTablica и четырьмя полями.

Все названия, включающие в себя пробелы, должны заключаться в квадратные скобки.

CREATE TABLE [Новая таблица]
(Идентификатор integer,
Имя char (10),
[Место расположения] char (10),
Метраж declmal);

Обрати внимание, что все составные имена заключены в квадратные скобки. При работе с запросом, ты так же должен использовать такие скобки:

Select *
From [Новая таблица]
WHERE
Идентификатор=10 and
[Место расположения] LIKE ‘Москва’;

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

Теперь поговорим о создании индексов. В общем виде это выглядит так:

CREATE INDEX <Имя индекса> ON <Имя таблицы>
(<Имя поля> [,<Имя поля>]…);

Реальный пример:

CREATE INDEX NewIndex ON NewTable (name);

Здесь создаётся новый индекс с именем NewIndex в таблице NewTable для name. Если нужно создать уникальный индекс, то можно написать так:
CREATE UNIQUE INDEX NewIndex ON NewTable (name);

При создании простых индексов можно указать в скобках несколько полей, например:
CREATE INDEX NewIndex ON NewTable (name, city);
Это создаст составной индекс и проиндексирует таблицу сразу по двум полям name и city. Важно: при создании уникальных индексов такого делать нельзя. Поле должно быть одно.

Теперь поговорим о добавлении новых столбцов. Для этого существует команда ALTER TABLE. Вот так она выглядит в общем виде:
ALTER TABLE <Имя таблицы> ADD <Имя поля> <Тип> <Размер>;
Например:
ALTER TABLE Справочник ADD [Новое поле] INTEGER

Для удаления полей используем:

ALTER TABLE [Имя таблицы] DROP [Имя поля]

А для удаления таблиц используется команда DROP TABLE:
DROP TABLE < Имя таблицы >;

Настройка таблиц:

Рассмотрим общий случай:

CREATE TABLE Имя_Таблицы
(
Имя_Поля_1 Тип Ограничения,
Имя_Поля_2 Тип Ограничения,
);

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

CREATE TABLE NewTable
(
Name char (10) UNIQUE,
email char (10) NOT NULL
);

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

Для первичных ключей не нужно указывать уникальность, они уникальны от природы:

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE
);

Единственное ограничение, которое мы оставляем — это NOT NULL. Его желательно оставить, потому что первичные ключи не могут быть пустыми.

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

П1/П2
3 /3
4 /2
5 /3
4 /2

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

Так как же задать ограничение сразу по двум столбцам?

CREATE TABLE NewTable
(
Name char (10) NOT NULL,
email char (10) NOT NULL,
Phone char (10),
UNIQUE (Name, email)
);
В этом примере мы создали таблицу с тремя полями и первые два из них являются уникальными. Точно так же можно создать таблицу с первичным ключом из двух первых столбцов:

CREATE TABLE NewTable
(
Name char (10) NOT NULL,
email char (10) NOT NULL,
Phone char (10),
PRIMARY KEY (Name, email)
);

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

Есть ещё одно интересное ключевое слово — CHECK, которое позволяет задать диапазон допустимых значений в поле, например:

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110)
);

В этом примере мы добавили поле Age (Возраст) типа decimal. После этого поставили ключевое слово CHECK, которое задаёт ограничение. После этого в скобках указываем это ограничение, что поле Age должно быть меньше 110 (Вряд ли, что кто-то проживёт больше 110 лет). Теперь усложним пример, сделав двойную проверку:

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110 and Age>0)
);

В этом примере мы сделали дополнительное ограничение. Теперь значение в поле Age должно быть больше 0 и меньше 100.

Есть ещё один тип ограничений — типа SQL оператора IN(который мы рассматривали чуть выше):

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110),
Town char(15) CHECK (Town in (‘Moscow’, ‘Piter’, ‘Brest’))
);

Здесь мы используем знакомый оператор IN, который перечисляет допустимые значения для поля Town. Так можно использовать любые допустимые операторы сравнения SQL. Например, можно использовать знаки множественного выбора (маски) такие как _ (подчёркивание — заменяет одну любую букву) и % (процент — заменяет множество букв). Эти маски мы уже изучали, так что давайте посмотрим пример:

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110),
Town char(15) CHECK (Town in (‘Moscow’, ‘Piter’, ‘Brest’)),
DateB char(10) CHECK (DateB LIKE ‘__/__/____’),
Password char(10) CHECK (DateB LIKE ‘RTY%’)
);

Здесь добавляем два поля:

• DateB (Дата рождения) — любое значение этого поля должно удовлетворять маске
__/__/____
• Password (Пароль) — пароль — слово, которое должно начинаться с трёх букв ‘RTY’

Помимо ограничений, нам доступны для настройки и значения по умолчанию, за это
отвечает слово DEFAULT:

CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) DEFAULT=’mail.ru’,
Age decimal CHECK(Age<110),
Town char (15) DEFAULT=’Moscow’
);

В этом примере мы сразу двум полям задали значения по умолчанию.


III) Разослать резюме


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

image


IV) Показать свои знания и адекватность на собеседовании


Обычно собеседование делятся на 3 этапа:
1) Встреча с девушкой из отдела кадров. На этом этапе будет несколько вопросов по вашим знаниям, чтобы было понятно, что вы в «теме» и много общих вопросов, чтобы определить вашу адекватность.
2) Тестовое задание — обычно дается на дом
3) Встреча с руководителем где будут вопросы, касающиеся ваших навыков тестирования.

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

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

Рассмотрим основные вопросы и и примеры самых обычных ответов на них:

1) Почему вы решили стать тестировщиком?
Меня всегда тянуло в IT сферу, эта профессия больше всего подходит моему характеру и моим интересам.

2) Что больше всего вам нравится в тестировании?
Я обожаю анализировать и изучать программы, например на прошлом месте работы мне больше всего нравилось работать с 1с, я даже смог поставить одну из версий себе на домашний компьютер, для более детального изучения программы, без всяких ограничений.

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

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

5) Почему вы ушли (уходите) из своей предыдущей компании?
Мне нравилось работать в прошлой компании, но я хочу опробовать себя как тестировщик ПО. Так как данная сфера ближе к моим интересам, характеру и увлечениям. На этой должности я буду получать гораздо большое удовольствия от работы.

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

7) Что бы вы пожелали усовершенствовать в себе? Что вы для этого делаете?
У меня есть хобби — программирование. Хочу совершенствовать свои навыки в этой области, они же в дальнейшем помогут улучшить мои навыки тестировщика.

8) Что вы ждете от нашей компании?
Хороший коллектив, и профессиональное развитие

9) Какой минимальный доход вас устроит?
Можно посмотреть средний доход по региону на эту вакансию и назвать его. Но, если вы проходите собеседование в 2гис, то говорите что готовы работать бесплатно 24/7/365, как рекомендует Савин. Так как эта книга эталон для их отдела кадров и им будет приятно знать что вы ее уже прочитали.

10) Какими источниками вы пользуетесь для развития в этой области
Можно посмотреть в конец статьи и назвать все, что будет в списке «Источники, которые были использованы для написания статьи:»

11) Кем вы видите себя через 5 лет?
Тут на ваш вкус.

В принципе все. У вас все получится. Главное:

image

Источники, которые были использованы для написания статьи:
Роман Савин. Тестирование Дот Ком;
Wiki Тестирование программного обеспечения;
Флёнов Михаил. Язык запросов SQL;
Wiki sql;
Форум тестировщиков;
habrahabr.ru;
Книги для молодых тестировщиков.

ссылка на оригинал статьи http://habrahabr.ru/post/234725/

Lucidchart vs Visio


Сегодня веб-проект для работы с диаграмами Lucidchart анонсировал улучшенную поддержку мобильных устройств и бета версию импорта из аналога Microsoft Visio для iOs — OmniGraffle. Кроме того несколько недель назад команда Lucidchart начала противопоставлять себя уже Microsoft Visio предложив делать загрузку/импорт до 200-т документов Visio за раз. Сами мы используем полнофункциональную версию уже более года по академической лицензии. Про новые возможности и опыт использования продукта под катом (+ более десятка картинок).

Сразу скажу — чего не появилось:
  • Импорт / экспорт SQL для рисования UML диаграмм в какой нибудь распространённый формат
  • Прямая печать из браузера, минуя сохранение в pdf
  • Корректная поддержка русских букв в названии листов при импорте из Visio




Заявленные преимущества перед Visio


Сокращённый вольный перевод, c моими комментариями. ссылка на полный оригинал в конце

  1. Бесплатный просмотр любого файла Visio в Lucidchart — для этого достаточно зарегистрироваться;
  2. Импорт шаблонов Visio stencils;
  3. Экспорт в Visio — платная Pro версия;
  4. Ценовая доступность — их расчёты:


  5. Лёгкость использования. Субъективно, достаточно комфортно на десктопах и сложности на портативных устройствах. Отдельного приложения для мобильных платформ нет — впечатление, о том что принято решение развивать только веб направление;
  6. Совместная работа — документ может редактировать и обсуждать сразу несколько участников;
  7. Актуальность — это веб приложение, соответственно нет необходимости скачивать/устанавливать обновления;
  8. Работа с любого устройства на любой операционной системе — одно из главных, на мой взгляд преимуществ.




Визуально:





На хабре давно не было постов с упоминанием Lucidchart`a, поэтому:


От себя добавлю


  • не использует Adobe Flash;
  • для совместной работы даже есть чат внутри интерфейса;
  • возможно работать офф-лайн ;
  • возможность устанавливать пароль на документы
  • встраивание в документы Google Docs (надо подключать отдельно от приложения Google Drive);
  • в документе может быть несколько вкладок
  • множество готовых шаблонов.


Мобильный вид




Опыт использования




Импорт Visio


Загрузка 64 -х 'придуманных' файлов .vsd прошла не до конца:



Где бы вы не были — импорт грузит в корневую директорию



В учебном и научно-исследовательском процессе мы стараемся выбирать продукты отвечающие следующим пунктам:

  • Актуальный — регулярно появляются новые функции/версии которые можно использовать за пределами ВУЗа )
  • Возможность совместной работы
  • Кроссплатформенный — у нас настоящий зоопарк в плане стоящих операционок, радует отсутствие необходимости готовить класс



Но главное, как студенту/аспиранту/преподавателю — полностью бесплатная полнофункциональная академическая лицензия на достаточно большое количество пользователей (50-100), для получения которой хватает одного письма с ящика в домене Университета с текстом в стиле "Здравствуйте! Я преподаватель/студент/аспирант технического университета (ссылка на сайт). Желаю использовать Ваш продукт в учебных/научных целях." и нескольких дней терпения. Идеально — если не надо каждый год запрашивать новый ключ (GitHub, Lucidchart).

Например так:


Используем на лабораторных работах и при проектировании программ. Продукт достаточно прожорливый — каждая вкладка потребляет порядка 100 мегабайт в памяти. Сто пользователей и 100 Гб дали не сразу, сначала мы попросили на тест лицензию для 4-х пользователей, затем для 100.

При положительном ответе приходит письмо


И появляется раздел в котором могут регистрироваться новые участники


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

Ещё немного про versus — в блогах Lucidchart и Microsoft появились сходные посты про создание схемы серверной стойки, ссылки на соответствующие посты ниже. Результат:

Lucidchart



Microsoft Visio



Ссылки

ссылка на оригинал статьи http://habrahabr.ru/post/234695/

Прошивка ATtiny13 при помощи Arduino

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

Сегодня расскажу, как зашиваю Arduino’вские скетчи в ATtiny13A.

Итак, для начала нам нужно скачать вот этот архив (взято и совсем чуть-чуть доделано отсюда), положить файлы по адресу "\Documents\Arduino\hardware\". Должно получится что-то типа «C:\Users\Администратор\Documents\Arduino\hardware\attiny13\cores\core13».

Перезапускаем Arduino IDE, чтобы среда добавила новый микроконтроллер в список плат.

Обязательно проверяем, правильно ли у нас выбрано «расположение папки со скетчами» (посмотреть можно во вкладке «Файл/Настройки»):

image

Теперь прошьём в дуинку ArduinoISP из примеров Arduino IDE:

image

Потом подключим ATtiny13 к Arduino, как показано на картинке:

image

Потом нужно изменить тип программатора на Arduino as ISP, как показано на скриншоте:

image

Теперь мы можем выбрать, на какой частоте может работать микроконтроллер ATtiny13, с завода ATtiny13 работает на частоте в 1.2 мГц, то есть микроконтроллер тактируется от внутренней RC -цепочки на частоте в 9.6 мГц и включён делитель на 8, поэтому я указал частоту в 1.2 мГц как дефолтную:

image

Как видим, доступные частоты — 1.2 мГц, 4.8 мГц и 9.6 мГц. Для изменения частот нам нужно нажать на кнопку «Записать загрузчик», которая располагается в вкладке «Сервис».

Что же среда делает при нажатии на кнопку «Записать загрузчик»?

Arduino IDE в данном случае просто выставляет нужные фьюзы микроконтроллера. К примеру, мне нужно, чтобы ATtiny13 работал на частоте в 4.8 мГц, я выбираю нужную мне частоту и только один раз жму кнопку «Записать загрузчик» — всё. Теперь микроконтроллер будет всегда работать на заданной частоте, если будет нужно изменить частоту опять — проделываем описанную выше процедуру.

Сразу скажу, что рост частоты приведёт за собой рост потребления контроллера, для каких-то там мигалок выполнение 1.2 миллиона инструкций будет с лихвой, да и на такой частоте микроконтроллер потребляет около 1 миллиампера, вот скрин из даташита:

image

Минимальное рабочее напряжение, при котором ATtiny13 сохраняет работоспособность — 1.8 В, причем гарантировано будет работать, в данном случае, только на частоте в 1.2 мГц.

Итак, зашьем для начала пример blink, ну как же без него, работает?

image

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

100% поддерживаются следующие:

pinMode()
digitalWrite()
digitalRead()
analogRead()
analogReference(INTERNAL) / (EXTERNAL)
shiftOut()
pulseIn()
analogWrite()
millis()
micros()
delay()
delayMicroseconds()

Итак, как мы только что увидели, нам доступно всего 1024 байта.

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

Распиновка из даташита:

image

К примеру, PB4 — это то же, что и pin 4, или просто 4.
Аналоговые входы — все, на которых пишет ADC*, например PB4 — это ADC2. То есть для того, чтобы считать напряжение, пишем analogRead(A2); или просто analogRead(2);, аппаратный ШИМ поддерживают только порты 0 и 1.

Ветка на форуме Arduino.

Файлы ядра лежат здесь.

ссылка на оригинал статьи http://habrahabr.ru/post/234477/

Алгоритм принятия чужого проекта или что делать, когда у менеджеров случается медовый месяц

“Да потому что я постоянно этим занимаюсь” — Иван Селиховкин (@selihovkin) в ответ на вопрос, почему мы будем записывать видео именно на эту тему. :)


После публикации бесплатного курса “Практический PMBoK за 2.5 часа” мы получили массу вопросов про конкретику от тех, кто курс посмотрел, и немало вопросов-сомнений от тех, кто курс не смотрел и вообще сомневается, что курс на 2.5 часа может содержать что-то полезное. :)

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

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



7 последовательных шагов, которые должен пройти менеджер от своего “медового месяца” к выводам о том, что делать с проектом дальше.

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

P.S. В следующем видео думаем поговорить о том, что и как делать на этапе планирования проекта.

Все материалы по управлению проектами, опубликованные в нашем блоге:

ссылка на оригинал статьи http://habrahabr.ru/company/stratoplan/blog/234731/