Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 468 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 21:

Тестирование и анализ приложений

Аннотация: Данная лабораторная работа посвящена тестированию и анализу приложений.

Цель работы: освоить технологии тестирования и анализа приложений

Использование модульных тестов при тестировании приложений

В ходе освоения этого курса вы постоянно тестируете приложение. Фактически, когда мы создаём интерфейс приложения, программный код, запускаем приложение в эмуляторе или на устройстве, мы тестируем его. Более того, подготовка приложения к публикации в Магазине 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

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