1 Разработка через тестирование. 3 Определение Разработка через тестирование (англ. test-driven development) техника программирования, при которой модульные.

Презентация:



Advertisements
Похожие презентации
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Advertisements

EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
EXtreme Programming XP Тема 4. XP Тест – это процедура, которая позволяет либо подтвердить, либо опровергнуть работоспособность кода. Тесты должны быть.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Что нужно знать: динамическое программирование – это способ решения сложных задач путем сведения их к более простым задачам того же типа динамическое.
1 Д.з. Shape – типичные ошибки contains (Circle r x y) a b = if (sqrt ((x-a)^2+(y-b)^2)) Double contains:: a -> Double -> Double -> Bool instance Shape.
Test-Driven Development Разработка через тестирование.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
1 Программирование на языке Паскаль Ветвления. 2 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения:
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Software engineering Дмитриев Андрей Владиславович ©
Первые шаги в TDD 1. Павел Габриель руководитель проектов, программист «Смарт системз» 2.
Информатика ЕГЭ Уровень А5. Вариант 1 Определите значения переменных a, b, c после выполнения следующего фрагмента программы: a:=5; b:=1; a:=a+b; if a>10.
Модульное тестирование 1 ASP.NET MVC Что такое unit-тестирование? Unit-тестирование – проверка корректности небольших независимых кусочков кода.
1 Тема 1.7. Алгоритмизация и программирование Информатика.
Пусть дана система линейных алгебраических уравнений с n неизвестными: a 11 x 1 + a 12 x 2 + … + a 1n x n = b 1 a 21 x 1 + a 22 x 2 + … + a 2n x n = b.
Автор: учитель информатики МКОУ Плесской средней общеобразовательной школы Юдин Андрей Борисович Часть 1.
Методика автоматизации поиска некорректных модульных тестов Алексей Лянгузов. Sun Microsystems, Inc.
Транксрипт:

1 Разработка через тестирование

3 Определение Разработка через тестирование (англ. test-driven development) техника программирования, при которой модульные тесты для программы или е фрагмента пишутся до самой программы и, по существу, управляют е разработкой. Методика: Пишем новый код только тогда, когда автоматический тест не сработал. Удаляем дублирование

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

5 Цикл разработки (схема)

Цикл разработки Из репозитория извлекается программная система, находящаяся в согласованном состоянии, когда весь набор модульных тестов выполняется успешно. Добавляется новый тест. Он может состоять в проверке, реализует ли система некоторое новое поведение или содержит ли некоторую ошибку, о которой недавно стало известно. Успешно выполняется весь набор тестов, кроме нового теста, который выполняется неуспешно. Этот шаг необходим для проверки самого теста - включн ли он в общую систему тестирования и правильно ли отражает новое требование к системе, которому она, естественно, еще не удовлетворяет. Программа изменяется с тем, чтобы как можно скорее выполнялись все тесты. Нужно добавить самое простое решение, удовлетворяющее новому тесту, и одновременно с этим не испортить существующие тесты. Большая часть нежелательных побочных и отдалнных эффектов от вносимых в программу изменений отслеживается именно на этом этапе, с помощью достаточно полного набора тестов. 6

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

8 Пример 1. Числа Фибоначчи Последовательность Фибоначчи определяется следующим соотношением: F(n) = F(n – 1) + F(n – 2) F(1) = 1 F(0) = 0 Требуется написать функцию для определения n-го члена последовательности

9 } Пример 1. (продолжение) Первый тест [Test] public void TestFirstFibonacciNumber() { Assert.AreEqual(0, MathUtils.Fibonacci(0)); } Реализация функции public class MathUtils { public static uint Fibonacci(uint n) { return 0; }

10 Пример 1. (продолжение)

11 Пример 1. (продолжение) public void TestSecondFibonacciNumber() { Assert.AreEqual(1, MathUtils.Fibonacci(1)); } Проверяет второй член последовательности

12 Пример 1. (продолжение)

13 Пример 1. (продолжение) public static uint Fibonacci(uint n) { if (n == 0) return 0; else return 1; } Модифицируем функцию

14 Пример 1. (продолжение)

15 Пример 1. (продолжение) public void TestThirdFibonacciNumber() { Assert.AreEqual(1, MathUtils.Fibonacci(2)); } public void TestFourthFibonacciNumber() { Assert.AreEqual(2, MathUtils.Fibonacci(3)); } Добавляем новые тесты, проверяющие третий и четвртый члены.

16 Пример 1. (продолжение)

17 Пример 1. (продолжение) public static uint Fibonacci(uint n) { if (n == 0) return 0; else if (n == 1) return 1; else return Fibonacci(n - 1) + Fibonacci(n - 2); } Модифицируем функцию

18 Пример 1. (продолжение)

19 Пример 2. Функция CombinePaths Требуется реализовать функцию, складывающюю два пути. Например: C:\Data\ + MySQL\data.sql = C:\Data\MySQL\data.sql Необходимо учесть следующие варианты использования: 1. Разные вариации наличия/отсутствия завершающего и начального слэша в первом и втором путях соответственно C:\folder + file.txt C:\folder + \file.txt C:\folder\ + file.txt C:\folder\ + \file.txt 2. Если первый путь пуст '' + file.txt 3. Если второй путь абсолютный C:\folder + D:\folder2\file.txt

20 Пример 2. (продолжение) type TCombinePathTests = class(TTestCase) published procedure TestCombineSimplePaths; end; procedure TCombinePathTests.TestCombineSimplePaths; begin CheckEquals( 'C:\file_name.txt', CombinePaths('C:\', 'file_name.txt') ); end; Первый тест

21 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result := EmptyStr; end; Реализация функции

22 Пример 2. (продолжение)

23 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result := APath1 + APath2; end; Модифицируем функцию

24 Пример 2. (продолжение)

25 Пример 2. (продолжение) procedure TCombinePathTests. TestCombinePathsWithoutTrailingSlash; begin CheckEquals( C:\file_name.txt', CombinePaths('C:', 'file_name.txt') ); end;

26 Пример 2. (продолжение)

27 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result := IncludeTrailingPathDelimiter(APath1)+ APath2; end; Модифицируем функцию

28 Пример 2. (продолжение)

29 Пример 2. (продолжение) procedure TCombinePathTests. TestCombinePathsWithEmptyFirstPath; begin CheckEquals( 'file_name.txt', CombinePaths('', 'file_name.txt') ); end;

30 Пример 2. (продолжение)

31 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin if APath1 = EmptyStr then Result := APath2 else Result := IncludeTrailingPathDelimiter(APath1) + APath2; end; Модифицируем функцию

32 Пример 2. (продолжение)

33 function CombinePaths(const APath1, APath2: string): string; begin if IsAbsolutePath(APath2) or (APath1 = EmptyStr) then Result := APath2 else Result := IncludeTrailingPathDelimiter(APath1) + DeletePrecedingPathDelimiter(APath2); end; Окончательный вариант функции

Приёмы TDD Изолированный тест (Isolated Test) Список тестов (Test List) Сначала утверждение (Assertion First) Тестовые данные (Test Data) Понятные данные (Evident Data)

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

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

Сначала утверждение Такой подход позволяет мгновенно ответить на два важных вопроса: «Что считать правильным результатом теста?» и «Каким образом можно проверить его правильность?». Сначала мы определяем, что нужно получить, а потом создаем необходимые условия, чтобы assert прошел. В тесте не должно быть слишком много утверждений (идеальный вариант один, максимум три).

Тестовые данные Не используйте одинаковые данные. Если нет разницы между 1 и 2, берите 1. Если 3 набора дадут тот же результат, что и 10, используйте 3. Используйте реалистичные тестовые данные.

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

Понятные данные (пример) Bank bank = new Bank(); bank.addRate("USD", "GBP", STANDARD_RATE); bank.commission(STANDARD_COMMISSION); Money result = bank.convert(new Note(100, "USD"), "GBP"); assertEquals(new Note(49.25, "GBP"), result); Bank bank = new Bank(); bank.addRate("USD", "GBP", 2); bank.commission(0.015); Money result=bank.convert(new Note(100, "USD"), "GBP"); assertEquals(new Note(100 / 2 * ( ), "GBP"), result); Или более очевидно:

Список инструментов Java: JUnit; C++: CppUnit, Boost Test; Delphi: DUnit; PHP: PHPUnit; С#: NUnit. Полный список:

xUnit. Терминология Тестовый метод (test method) Метод, в котором выполняется проверка работы тестируемого объекта. Утверждение (assertion) Метод сравнения ожидаемых и фактических результатов. Фикстура уровня метода (method fixture) Набор операций, выполняемый до и после каждого тестового метода. Фикстура уровня класса (class fixture) Набор операций, выполняемый до и после всех тестовых методов класса.

xUnit. Порядок вызова Class SetUp Method SetUp Method SetUp Test Method 1 Test Method 2 Method TearDown Method TearDown Class TearDown

Инструменты unit-тестирования

Список инструментов Java: JUnit; C++: CppUnit, Boost Test; Delphi: DUnit; PHP: PHPUnit; С#: NUnit. Полный список:

xUnit. Терминология Тестовый метод (test method) Метод, в котором выполняется проверка работы тестируемого объекта. Утверждение (assertion) Метод сравнения ожидаемых и фактических результатов. Фикстура уровня метода (method fixture) Набор операций, выполняемый до и после каждого тестового метода. Фикстура уровня класса (class fixture) Набор операций, выполняемый до и после всех тестовых методов класса.

xUnit. Порядок вызова Class SetUp Method SetUp Method SetUp Test Method 1 Test Method 2 Method TearDown Method TearDown Class TearDown

JUnit 3 JUnit библиотека для тестирования программного обеспечения на языке Java. Создана Кентом Беком и Эриком Гаммой Берт сво начало в SUnit (тестовая среда для Smalltalk)

JUnit 3. Организация тестов Класс TestCase Разработчик наследует свои классы тестов от этого класса. Тестовые методы все методы класса, имя которых начинается с test. Класс TestCase реализует паттерн Шаблонный Метод (Template Method) и ссылается на виртуальные методы: setUp() runTest() tearDown()

JUnit 3. Организация тестов Класс TestSuite Используется для формирования набора тестов. Наборы тестов могут включать в себя одиночные тесты и другие наборы тестов. Реализует паттерн Компоновщик (Composite). Разработчику предлагается переопределять метод suite().

JUnit 3. Утверждения Класс Assert Содержит специальные методы сравнения Сравнение на равенство (assertEquals) Cравнение на истинность/ложность (assertTrue/assertFalse) Сравнение с нулевым указателем (assertNull и assertNotNull) Сравнение на идентичность/неидентичность (assertSame/assertNotSame) Является базовым классом для TestCase

JUnit 3. Пример public class TestGame extends TestCase { private Game g; public void setUp() { g = new Game(); } public void testTwoThrowsNoMark() { g.add(5); g.add(4); assertEquals (9, g.score()); }}}}

NUnit NUnit открытая среда юнит- тестирования приложений для.NET (включая платформу Mono). Портирован с языка java и написан на J#. Новые версии написаны на С# с учтом таких новшеств как атрибуты. Текущая версия:

NUnit. Организация тестов Для оргнизации тестов используются атрибуты: [Test] помечает тестовый метод. [TestFixture] помечает класс с набором тестов. [SetUp], [TearDown] помечает любую процедуру без параметров как фикстуру уровня метода.

NUnit. Утверждения Класс Assert Класс содержит статические методы проверки фактических значений с ожидаемыми: AreEqual, AreNotEqual. AreSame, AreNotSame. IsTrue, IsFalse. Greater, GreaterOrEqual, и т.п. IsNotNull, IsNull.

NUnit. Пример [TestFixture] public class TestGame { private Game game; [SetUp] public void SetUp() { game = new Game(); } [Test] public void TestTwoThrowsNoMark() { game.Add(5); game.Add(4); Assert.AreEqual(9, game.GetScore()); }}}}

NUnit. Утверждения С версии NUnit 2.4 введены constraint-based утверждения. Новый тип утверждений базируется на статической функции Assert.That() Assert.That(object actual, IResolveConstraint constraint, string message);

NUnit. Утверждения Assert.That(myString, Is.EqualTo("Hello")); Assert.That(7, Is.GreaterThanOrEqualTo(3)); Assert.That(phrase, Contains.Substring("tests fail")); Assert.That(phrase, Is.Not.StringContaining("tests pass")); Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10)); Примеры использования constraint-based утверждений:

CppUnit CppUnit – библиотека тестирования для языка C++. Является портом с JUnit на С++. Текущая версия:

CppUnit. Организация тестов CPPUNIT_TEST_SUITE, CPPUNIT_TEST_SUITE_END создают набор тестов. CPPUNIT_TEST создат тестовый метод. setUp(), tearDown() фикстуры уровня метода, виртуальные функции класса TestFixture.

CppUnit. Утверждения Проверочные методы реализованы в виде макросов: CPPUNIT_ASSERT CPPUNIT_ASSERT_EQUAL CPPUNIT_ASSERT_DOUBLES_EQUAL CPPUNIT_ASSERT_THROW CPPUNIT_ASSERT_NO_THROW

CppUnit. Пример class TestGame : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(TestGame); CPPUNIT_TEST(testTwoThrowsNoMark); CPPUNIT_TEST_SUITE_END(); protected: Game * game; protected: void testTwoThrowsNoMark(); public: void setUp(); void tearDown(); };

CppUnit. Пример void TestGame::setUp() { game = new Game(); } void TestGame::tearDown() { delete game; } void TestGame::testTwoThrowsNoMar() { game->Add(5); game->Add(4); CPPUNIT_ASSERT( game->GetScore() == 9 ); }

JUnit 4 JUnit 4 новая версия библиотеки, построенная на появившихся в Java 5 аннотациях. Текущая версия: 4.8.2

JUnit 4. Организация тестов Набор тестов помещается в отдельный класс. Для организации тестов используются помечает помечает любую процедуру без параметров как фикстуру помечает любую процедуру без параметров как фикстуру уровня класса

JUnit 4. Утверждения Класс Assert Содержит набор статических методов, аналогичный набору JUnit 3 assertEquals, assertSame/assertNotSame, assertArrayEquals, assertFalse/assertTrue, assertNull/assertNotNull.

JUnit 4. Пример 1 public class TestGame public void testTwoThrowsNoMark() { g = new Game(); g.add(5); g.add(4); Assert. assertEquals (9, g.score()); }}}}

JUnit 4. Пример 2 public class TestGame { private Game public void setUp() { g = new Game(); public void twoThrowsNoMark() { g.add(5); g.add(4); Assert. assertEquals (9, g.score()); }}}}

DUnit Dunit инструмент тестирования для среды Borland Delphi. Первоначальная версия написана Juanco Anez в 2000г. DUnit стал стандартной частью в среде разработки Delphi 2005.

DUnit. Организация тестов Класс TTestCase Разработчик наследует свои классы тестов от этого класса. Тестовые методы это все методы без параметров, которые находятся в published секции класса. Фикстуры уровня метода определяются перегрузкой виртуальных функций SetUp и TearDown.

DUnit. Утверждения Класс TTestCase содержит набор проверочных методов: CheckEquals/CheckNotEquals CheckNull/CheckNotNull CheckSame CheckIs CheckInherits

DUnit. Пример type TGameTest = class(TTestCase) private FGame: TGame; protected procedure SetUp; override; procedure TearDown; override; published procedure TestTwoThrowsNoMark; end;

DUnit. Пример { TGameTest } procedure TGameTest.SetUp; Begin inherited; FGame := TGame.Create; end; procedure TGameTest.TearDown; Begin FreeAndNil(FGame); inherited; end; procedure TGameTest.TestTwoThrowsNoMark; begin FGame.Add(5); FGame.Add(4); CheckEquals(9, FGame.Score); end;