тестирование. Тестир. инф. систем Метод материалы. Сыркин Илья Сергеевич Тестирование информационных систем методические указания
Скачать 2.91 Mb.
|
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Кузбасский государственный технический университет имени Т. Ф. Горбачева» Кафедра информационных и автоматизированных производственных систем Составитель И. С. Сыркин ТЕСТИРОВАНИЕ ИНФОРМАЦИОННЫХ СИСТЕМ Методические указания материалы Рекомендовано цикловой методической комиссией специальности СПО 09.02.07 Информационные системы и программирование в качестве электронного издания для использования в образовательном процессе Кемерово 2018 1 Рецензенты Ванеев О. Н. – кандидат технических наук, доцент кафедры информа- ционных и автоматизированных производственных систем ФГБОУ ВО «Куз- басский государственный технический университет имени Т. Ф. Горбачева» Чичерин И. В. – кандидат технических наук, доцент, зав. кафедрой ин- формационных и автоматизированных производственных систем ФГБОУ ВО «Кузбасский государственный технический университет имени Т. Ф. Горба- чева» Сыркин Илья Сергеевич Тестирование информационных систем: методические указания к практическим занятиям и лабораторным работам [Электронный ресурс]: для обучающихся специальности СПО 09.02.07 Информационные системы и про- граммирование очной формы обучения / сост. И. С. Сыркин; КузГТУ. – Элек- трон. издан. – Кемерово, 2018. Методические материалы для дисциплины «Тестирование информаци- онных систем» содержат перечень выполняемых практических и лаборатор- ных работ, контрольные вопросы к ним. КузГТУ, 2018 Сыркин И. С., составление, 2018 2 Предисловие Целью освоения дисциплины «Тестирование информацион- ных систем» является приобретение обучающимися знаний в облас- ти проведения тестирования ПО в процессе его создания. Основными задачами изучения дисциплины «Тестирование информационных систем», являются: 1. Изучение способов создания тестов. 2. Проведение тестов безопасности. 3. Изучение нагрузочного тестирования. Содержание дисциплины в соответствии с учебным планом В соответствии с учебным планом изучение дисциплины «Технологии разработки программного обеспечения» предусматри- вает проведение лекционных, практических занятий, лабораторных работ и самостоятельной работы обучающимися очной формы обу- чения. Общая трудоемкость дисциплины составляет 142 часа. Промежуточный контроль – экзамен (6 семестр). Содержание практических занятий и лабораторных работ При подготовке к практическим занятиям обучающиеся само- стоятельно изучают основную и дополнительную литературу, гото- вят конспекты по темам, предложенным преподавателем. На практических занятиях преподаватель осуществляет кон- троль подготовки качества знаний обучающегося, используя: опрос, обсуждение вопросов по темам изучаемой дисциплины, письмен- ный опрос при текущем контроле и предоставление отчетов по практическим занятиям. 3 1. Практическое занятие №1. Разработка тестовых сценариев Целью работы является изучение способов разработки тестов ПО. Результатом практической работы является отчет, в котором должны быть приведены анализ предметной области и требований к системе. Для выполнения практической работы № 1 студент должен изучить приведенный ниже теоретический материал. Отчет сдается в распечатанном и электронном (файл Word) видах. 1.1. Разработка тестовых сценариев 1. Создайте проект для тестирования 1. Запустите Visual Studio. 2. В меню Файл выберите пункт Создать > Проект. Откроется диалоговое окно Новый проект . 3. В области Установленные шаблонывыберите шаб- лон Visual C#. 4. В списке типов приложения выберите пункт Библиотека классов. 5. В поле Имя введите Bank и нажмите OK. Будет создан новый проект Bank. Этот проект отобразится в обозревателе решений, а его файл Class1.cs откроется в редакто- ре кода. Примечание Если файл Class1.cs не откроется в редакторе кода, дважды щелкните Class1.cs в обозревателе решений, чтобы открыть его. 6. Скопируйте исходный текст из раздела Пример проекта для создания модульных тестов и замените скопированным текстом ис- ходное содержимое файла Class1.cs. 7. Сохранение файла как BankAccount.cs. 8. В меню Сборка выберите Собрать решение. Будет создан проект с именем «Bank». Он содержит исходный код, подлежащий тестированию, и средства для его тестирова- ния. Пространство имен BankAccountNS проекта «Bank», содержит открытый класс «BankAccount», методы которого будут тестиро- ваться в приведенных ниже процедурах. В этой статье проводится тестирование на примере метода Debit. Метод Debit вызывается, когда денежные средства снимаются со счета. Так выглядит определение метода: 4 // Method to be tested. public void Debit(double amount) { if(amount > m_balance) { throw new ArgumentOutOfRangeException(«amount»); } if (amount < 0) { throw new ArgumentOutOfRangeException(«amount»); } m_balance += amount; } 2. Создание проекта модульного теста 3. В меню Файл выберите Добавить > Создать проект. 4. В диалоговом окне Новый проект разверните уз- лы Установленные и Visual C# и выберите Тест. 5. В списке шаблонов выберите Проект модульного теста. 6. В поле Имя введите BankTests, а затем нажмите кноп- ку ОК. Проект BankTests добавляется в решение Банк. 7. В проекте BankTests добавьте ссылку на проект Банк. В обозревателе решений щелкните Ссылки в проек- те BankTests, а затем выберите в контекстном меню Добавить ссылку. 8. В диалоговом окне Диспетчер ссылок разверните Решение и проверьте элемент Банк. 9. Создание тестового класса Создание тестового класса, чтобы проверить класс BankAccount. Можно использовать UnitTest1.cs, созданный в шаб- лоне проекта, но лучше дать файлу и классу более описательные имена. Можно сделать это за один шаг, переименовав файл в обозревателе решений. 10. Переименование файла класса В обозревателе решений выберите файл UnitTest1.cs в проек- те BankTests. В контекстном меню выберите команду Переимено- вать, а затем переименуйте файл в BankAccountTests.cs. Выберите Да в диалоговом окне, предлагающем переименовать все ссылки на элемент кода UnitTest1 в проекте. 5 Этот шаг изменяет имя класса на BankAccountTests. Файл BankAccountTests.cs теперь содержит следующий код: using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace BankTests { [TestClass] public class BankAccountTests { [TestMethod] public void TestMethod1() { } } } 11. Добавление оператора using в тестируемый проект Можно также добавить оператор using в класс, чтобы тести- руемый проект можно было вызывать без использования полных имен. Вверху файла класса добавьте: C#Копировать using BankAccountNS; 12. Требования к тестовому классу Минимальные требования к тестовому классу следующие: Атрибут [TestClass] является обязательным для платформы модульных тестов Microsoft для управляемого кода в любом классе, содержащем методы модульных тестов, которые необходимо вы- полнить в обозревателе тестов. Каждый метод теста, предназначенный для запуска в обо- зревателе тестов, должен иметь атрибут [TestMethod]. Можно иметь другие классы в проекте модульного теста, ко- торые не содержат атрибута [TestClass], а также иметь другие мето- ды в тестовых классах, у которых атрибут – [TestMethod]. Можно использовать эти другие классы и методы в методах теста. 13. Создание первого тестового метода В этой процедуре мы напишем методы модульного теста для проверки поведения метода Debit класса BankAccount. Метод Debit приведен выше в этой статье. 6 Существует по крайней мере три поведения, которые требует- ся проверить: Метод создает исключение ArgumentOutOfRangeException, если сумма по дебету превышает баланс. Метод создает исключение ArgumentOutOfRangeException, если сумма по дебету меньше нуля. Если значение дебета допустимо, то метод вычитает сумму дебета из баланса счета. Совет Метод по умолчанию TestMethod1 можно удалять, так как он не используется в этом руководстве. 14. Создание метода теста Первый тест проверяет, снимается ли со счета нужная сумма при допустимом размере кредита (со значением меньшим, чем ба- ланс счета, и большим, чем ноль). Добавьте следующий метод в этот класс BankAccountTests : [ TestMethod] public void Debit_WithValidAmount_UpdatesBalance() { // Arrange double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44; BankAccount account = new BankAccount(«Mr. Bryan Walton», begin- ningBalance); // Act account.Debit(debitAmount); // Assert double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, «Account not debited correct- ly»); } Метод очень прост: он создает новый объект BankAccount с начальным балансом, а затем снимает допустимое значение. Он ис- пользует метод AreEqual, чтобы проверить, что конечный баланс соответствует ожидаемому. 7 15. Требования к методу теста Метод теста должен удовлетворять следующим требованиям: Он декорируется атрибутом [TestMethod]. Он возвращает void. Он не должен иметь параметров. 16. Сборка и запуск теста 1. В меню Построение выберите Построить решение. Если ошибок нет, появится обозреватель тестов с элемен- том Debit_WithValidAmount_UpdatesBalance в группе Незапус- кавшиеся тесты. Совет Если обозреватель тестов не откроется после успешной сбор- ки, выберите в меню пункт Тест, щелкните Windows, а затем – Обозреватель тестов. 2. Выберите Запустить все, чтобы выполнить тест. Во время выполнения теста в верхней части окна отображается анимирован- ная строка состояния. По завершении тестового запуска строка со- стояния становится зеленой, если все методы теста успешно прой- дены, или красной, если какие-либо из тестов не пройдены. 3. В данном случае тест пройден не будет. Метод теста будет перемещен в группу Неудачные тесты. Выберите этот метод в обозревателе тестов для просмотра сведений в нижней части окна. 17. Исправление кода и повторный запуск тестов 18. Анализ результатов теста Результат теста содержит сообщение, описывающее возник- шую ошибку. Для метода AreEqual сообщение отражает ожидаемый результат (параметр Ожидается<значение>) и фактически полу- ченный (параметр Фактическое<значение>). Ожидалось, что ба- ланс уменьшится, а вместо этого он увеличился на сумму списания. Модульный тест обнаружил ошибку: сумма списания добавля- ется на баланс счета, вместо того чтобы вычитаться. 19. Исправление ошибки Для исправления ошибки замените строку: m_balance += amount; на: C#Копировать m_balance -= amount; 8 20. Повторный запуск теста В обозревателе тестов выберите Запустить все, чтобы запус- тить тест повторно. Красно-зеленая строка состояния станет зеле- ной, сигнализируя о том, что тест пройден, а сам тест будет пере- мещен в группу Пройденные тесты. 21. Использование модульных тестов для улучшения кода В этом разделе рассматривается, как последовательный про- цесс анализа, разработки модульных тестов и рефакторинга может помочь сделать рабочий код более надежным и эффективным. 22. Анализ проблем Мы создали тестовый метод для подтверждения того, что до- пустимая сумма правильно вычитается в методе Debit. Теперь про- верим, что метод создает исключение ArgumentOutOfRangeException, если сумма по дебету: больше баланса или меньше нуля. 23. Создание методов теста Создадим метод теста для проверки правильного поведения в случае, когда сумма по дебету меньше нуля: [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void De- bit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange() { // Arrange double beginningBalance = 11.99; double debitAmount = -100.00; BankAccount account = new BankAccount(«Mr. Bryan Walton», begin- ningBalance); // Act account.Debit(debitAmount); // Assert is handled by the ExpectedException attribute on the test me- thod. } Мы используем атрибут ExpectedExceptionAttribute для под- тверждения правильности созданного исключения. Данный атрибут приводит к тому, что тест не будет пройден, если не возникнет ис- 9 ключения ArgumentOutOfRangeException. Если временно изменить тестируемый метод для вызова более общего исключения ApplicationException при значении суммы по дебету меньше нуля, то тест работает правильно – то есть завершается неудачно. Чтобы проверить случай, когда размер списания превышает баланс, выполните следующие действия: 1. Создать новый метод теста с именем De- bit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRa nge. 2. Скопировать тело метода из De- bit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange в новый метод. 3. Присвоить debitAmount значение, превышающее баланс. 24. Запуск тестов Запуск двух методов теста показывает, что тесты работают правильно. 25. Продолжение анализа Однако последние два тестовых метода вызывают беспокойст- во. Нельзя быть уверенным, какое именно условие тестируемого метода создает исключение при запуске любого из тестов. Если ка- ким-либо способом разделить эти два условия, а именно отрица- тельную сумму по дебету и сумму, большую, чем баланс, то это увеличит достоверность проведения тестов. Еще раз посмотрев на тестируемый метод и заметив, что оба условных оператора используют конструктор ArgumentOutOfRangeException, который просто получает имя аргу- мента в качестве параметра: C#Копировать throw new ArgumentOutOfRangeException(«amount»); Так выглядит конструктор, который можно использовать для сообщения более детальной информации: ArgumentOutOfRangeEx- ception(String, Object, String) включает имя аргумента, значения ар- гумента и определяемое пользователем сообщение. Мы можем вы- полнить рефакторинг тестируемого метода для использования дан- ного конструктора. Более того, можно использовать открытые для общего доступа члены типа для указания ошибок. 10 26. Рефакторинг тестируемого кода Сначала определим две константы для сообщений об ошибках в области видимости класса. Добавьте это в тестируемый класс BankAccount: public const string DebitAmountExceedsBalanceMessage = «Debit amount exceeds balance»; public const string DebitAmountLessThanZeroMessage = «Debit amount is less than zero»; Затем изменим два условных оператора в методе Debit: C#Копировать if (amount > m_balance) { throw new ArgumentOutOfRangeException(«amount», amount, Debi- tAmountExceedsBalanceMessage); } if (amount < 0) { throw new ArgumentOutOfRangeException(«amount», amount, Debi- tAmountLessThanZeroMessage); } 27. Рефакторинг тестовых методов Удалим атрибут ExpectedException метода теста, и вместо это- го будем перехватывать исключение и проверять соответствующее ему сообщение. Метод StringAssert.Contains обеспечивает возмож- ность сравнения двух строк. В этом случае метод Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOf Range может выглядеть следующим образом: [TestMethod] public void De- bit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange() { // Arrange double beginningBalance = 11.99; double debitAmount = 20.0; BankAccount account = new BankAccount(«Mr. Bryan Walton», begin- ningBalance); 11 // Act try { account.Debit(debitAmount); } catch (ArgumentOutOfRangeException e) { // Assert StringAssert.Contains(e.Message, BankAc- count.DebitAmountExceedsBalanceMessage); } } 28. Повторное тестирование, переписывание и анализ Предположим, что в тестируемом методе есть ошибка, и метод Debit даже не создает исключение ArgumentOutOfRangeException, не говоря уже о выводе правильного сообщения с исключением. В этом случае метод теста не сможет обработать этот случай. Если значение debitAmount допустимо (то есть меньше баланса, но боль- ше нуля), то исключение не перехватывается, а утверждение нико- гда не сработает. Однако метод теста проходит успешно. Это нехо- рошо, поскольку метод теста должен был завершиться с ошибкой в том случае, если исключение не создается. Это является ошибкой в методе теста. Для решения этой про- блемы добавим утверждение Fail в конце тестового метода для об- работки случая, когда исключение не создается. Однако повторный запуск теста показывает, что тест теперь ока- зывается непройденным при перехватывании верного исключе- ния. Блок catch перехватывает исключение, но метод продолжает вы- полняться, и в нем происходит сбой на новом утвержде- нии Fail. Чтобы разрешить эту проблему, добавим опера- тор return после StringAssert в блоке catch. Повторный запуск теста подтверждает, что проблема устранена. Окончательная версия метода Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange выглядит следующим образом: [TestMethod] public void De- bit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange() { // Arrange 12 double beginningBalance = 11.99; double debitAmount = 20.0; BankAccount account = new BankAccount(«Mr. Bryan Walton», begin- ningBalance); // Act try { account.Debit(debitAmount); } catch (ArgumentOutOfRangeException e) { // Assert StringAssert.Contains(e.Message, BankAc- count.DebitAmountExceedsBalanceMessage); return; } Assert.Fail(«The expected exception was not thrown.»); } Усовершенствования тестового кода привели к созданию бо- лее надежных и информативных методов теста. Но что более важно, в результате был также улучшен тестируемый код. |