Тестирование. Тесты как спецификация

Содержание

Слайд 2

ТЕСТЫ КАК СПЕЦИФИКАЦИЯ

ТЕСТЫ КАК СПЕЦИФИКАЦИЯ

Слайд 3

Будет ли тест понятен ревьюеру? Сможет ли ревьюер быстро убедиться в корректности теста? ДОВЕРИЕ ТЕСТАМ

Будет ли тест понятен ревьюеру?
Сможет ли ревьюер быстро убедиться в корректности

теста?

ДОВЕРИЕ ТЕСТАМ

Слайд 4

class Superman_should { [Test] public void save_kitten_from_tree(){ … superman.Act(); Assert.IsTrue(kitten.IsSaved()); }

class Superman_should {
[Test]
public void save_kitten_from_tree(){
… superman.Act();
Assert.IsTrue(kitten.IsSaved());
}
[Test]
public void wear_redBlue_suit(){
… }

}

ТЕСТЫ КАК СПЕЦИФИКАЦИЯ

Слайд 5

Arrange Act Assert ПРАВИЛЬНАЯ СТРУКТУРА ТЕСТА

Arrange
Act
Assert

ПРАВИЛЬНАЯ СТРУКТУРА ТЕСТА

Слайд 6

Что должно быть в имени теста? Conditions: preconditions, input, state System

Что должно быть в имени теста?
Conditions: preconditions, input, state
System Under Test:

class name, method name
Expected behaviour / Requirement to check
http://java.dzone.com/articles/7-popular-unit-test-naming

ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ

Слайд 7

ParserTests.TestParse? ParserTests.Parse_Fails? ParserTests.Parse_BigNumbers? ParserTests.Parse_NumbersGreaterThanMaxInt? ParserTests.Fail_OnNegativeNumbers? ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ

ParserTests.TestParse?
ParserTests.Parse_Fails?
ParserTests.Parse_BigNumbers?
ParserTests.Parse_NumbersGreaterThanMaxInt?
ParserTests.Fail_OnNegativeNumbers?

ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ

Слайд 8

isAdult_AgeLessThan18_False ParseInt_should.Fail_OnNonNumber Stack_should.BeEmpty_AfterCreation When_MandatoryFieldsAreMissing_Expect_StudentAdmissionToFail ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ

isAdult_AgeLessThan18_False
ParseInt_should.Fail_OnNonNumber
Stack_should.BeEmpty_AfterCreation
When_MandatoryFieldsAreMissing_Expect_StudentAdmissionToFail

ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ

Слайд 9

Local Hero Loudmouth Free Ride Over specification http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/ АНТИПАТТЕРНЫ

Local Hero
Loudmouth
Free Ride
Over specification
http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/

АНТИПАТТЕРНЫ

Слайд 10

ПРИМЕР СПЕЦИФИКАЦИИ ТЕСТАМИ

ПРИМЕР СПЕЦИФИКАЦИИ ТЕСТАМИ

Слайд 11

ПИШЕМ ТЕСТЫ ЛЕГКО ТЕСТ НАПИСАТЬ – КАК ЧАЙ ПОПИТЬ

ПИШЕМ ТЕСТЫ ЛЕГКО

ТЕСТ НАПИСАТЬ – КАК ЧАЙ ПОПИТЬ

Слайд 12

SetUp, TearDown Comparer, Equal, ToString Собственные Assert-ы БОРЬБА С ДУБЛИРОВАНИЕМ

SetUp, TearDown
Comparer, Equal, ToString
Собственные Assert-ы

БОРЬБА С ДУБЛИРОВАНИЕМ

Слайд 13

Они же Data Driven PARAMETRIZED TESTS

Они же Data Driven

PARAMETRIZED TESTS

Слайд 14

[Test, Timeout(1000)] public void Test() { … } ОГРАНИЧЕНИЕ ПО ВРЕМЕНИ

[Test, Timeout(1000)]
public void Test()
{

}

ОГРАНИЧЕНИЕ ПО ВРЕМЕНИ

Слайд 15

Assert.AreEqual(expected, actual) или Assert.AreEqual(actual, expected)? Assert — корявая семантика (2+2).Should().Be(4) —

Assert.AreEqual(expected, actual) или Assert.AreEqual(actual, expected)?
Assert — корявая семантика (2+2).Should().Be(4) — лучше!
Неинформативные исключения «Expected True

but was False»
FluentAssertions – доступны через NuGet

FLUENT ASSERTIONS

Слайд 16

Resharper → Tools → Templates Explorer → Import → tests-templates.DotSettings tf

Resharper → Tools → Templates Explorer → Import → tests-templates.DotSettings
tf — TestFixture
tt —

Test
su — SetUp
Ctrl+T+R или Ctrl+U+R

ФИШКИ RESHARPER

Слайд 17

CHALLENGE

CHALLENGE

Слайд 18

В проекте Challenge в файле WordsStatistics_Tests напишите тесты: WordsStatistics — должен

В проекте Challenge в файле WordsStatistics_Tests напишите тесты:
WordsStatistics — должен проходить все

тесты.
WordStatisticsXXX — некорректные реализации. Должны падать хотя бы на одном тесте.
Запускайте по Ctrl+F5.
Не открывайте файл DoNotOpen!

CHALLENGE

Слайд 19

Открываем DoNotOpen! CHALLENGE

Открываем DoNotOpen!

CHALLENGE