Тестирование и анализ приложений
Цель работы: освоить технологии тестирования и анализа приложений
Использование модульных тестов при тестировании приложений
В ходе освоения этого курса вы постоянно тестируете приложение. Фактически, когда мы создаём интерфейс приложения, программный код, запускаем приложение в эмуляторе или на устройстве, мы тестируем его. Более того, подготовка приложения к публикации в Магазине Windows Phone подразумевает проведение целого ряда испытаний, которые позволяют повысить вероятность приёма приложения для публикации и обнаружить недоработки, которые допущены при создании приложения. Существуют, однако, специализированные инструменты для тестирования приложений. Один из них – это модульное тестирование (unit testing). Проект Приложение модульного тестирования доступен в Экспресс-выпуске Microsoft Visual Studio 2012 для Windows Phone после установки второго пакета обновлений этой среды.
Модульные тесты предназначены для автоматизации проверки правильности работы отдельных программных модулей. В частности, это касается правильной работы классов и их методов. Методика модульного тестирования даст наилучшие результаты при применении её к проектам, разработанным с использованием технологии MVVM – чем слабее взаимосвязи отдельных классов приложения – тем лучше, так как тестируя отдельный класс можно сосредоточиться на его функциональности и обнаруженные при тестировании ошибки с очень высокой долей вероятности будут относиться именно к тестируемому классу.
Упрощённо говоря, модульный тест – это некий набор входных параметров, передача которых классу должна приводить к получению некого набора выходных параметров, которые можно сравнить с эталоном. Создавать модульные тесты можно непосредственно в процессе написания классов. Фактически, эти тесты являются чем-то вроде документации по создаваемым классам, так как в них зафиксировано то, как именно должны работать классы. Наличие модульных тестов значительно облегчает жизнь разработчиков при необходимости внесения изменений в исходные классы, в алгоритмы, которые используются для решения каких-либо задач. Если интерфейс (входные и выходные параметры) обновленного класса выглядит так же, как интерфейс исходного класса, применив к нему те же модульные тесты, можно либо убедиться в правильной работе класса, либо в том, что в ходе его модификации допущены ошибки, искажающие результаты его работы. Существует, кроме того, методология разработки программного обеспечения, которая называется разработкой через тестирование (test-driven development, TDD). При таком подходе сначала пишут модульный тест, потом – соответствующий класс. При этом если в класс нужно внести изменения, влияющие на его входные и выходные данные, сначала пишется модульный тест для проверки работы класса, после этого вносятся исправления в класс и результат проверяется модульным тестом.
Рассмотрим пример тестирования с использованием модульных тестов. Он рассмотрен в проекте приложения P21_1. Пример основан на материале "Unit testing for Windows Phone" ("Модульное тестирование для Windows Phone"), http://msdn.microsoft.com/en-us/library/windowsphone/develop/dn168930%28v=vs.105%29.aspx.
Проект приложения вы можете увидеть на рис. 57.1.
увеличить изображение
Рис. 57.1. Проект приложения, иллюстрирующего применение модульного тестирования
В левой части экрана расположена панель, с которой до этого мы не работали. Это Обозреватель тестов, открыть её можно, воспользовавшись командой Тест > Окна > Обозреватель тестов. Эта панель служит для управления модульными тестами.
В решении присутствуют два проекта. Первый – P21_1 – это обычный проект приложения для Windows Phone, второй – это добавленный в решение проект, созданный о шаблону Приложение модульного тестирования для Windows Phone. Для того, чтобы добавить такой проект в решение, нужно воспользоваться контекстным меню Решение > Добавить > Создать проект.
Проект модульного тестирования называется BankAccountTest, обратите внимание на то, что после добавления в решение этого проекта нужно добавить ссылку на проект нашего приложения (P21_1) в папку References.
В проекте BankAccountTest есть класс UnitTest1 – в нём и будет располагаться модульный тест.
В приложении имеется класс BankAccounts (Листинг 57.1), его мы будем тестировать. Этот класс хранит сведения об имени клиента (customerName) и балансе его счёта (Balance). Класс имеет два метода. Метод Debit используется для списания средств со счёта, перед списанием проводится проверка на неотрицательность списываемой суммы и на то, не превышает ли она баланса счёта. Метод Credit используется для зачисления средств на счёт, перед зачислением производится проверка на неотрицательность.
using System; namespace P21_1 { public class BankAccount { public string CustomerName { get; private set; } public double Balance { get; private set; } private BankAccount() { } public BankAccount(string customerName, double balance) { CustomerName = customerName; Balance = balance; } //Снятие со счета public void Debit(double amount) { if (amount > Balance) { throw new ArgumentOutOfRangeException("amount"); } if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } Balance -= amount; } //Пополнение счета public void Credit(double amount) { if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } Balance += amount; } } }Листинг 57.1. Код файла BankAccount.cs
С помощью модульного теста мы можем проверить правильность работы логики класса, зная, что при списании средств со счёта баланс счёта уменьшается на списываемую сумму, и что при зачислении средств на счёт баланс на зачисляемую сумму увеличивается.