Похожие презентации:
Тестирование. Тесты как спецификация
1. ТЕСТИРОВАНИЕ
https://github.com/kontur-courses/testing2. Доверие тестам
ДОВЕРИЕ ТЕСТАМ• Будет ли тест понятен ревьюеру?
• Можно ли быстро убедиться в корректности
теста?
• Можно ли быстро понять, что он проверяет?
3. Тесты как спецификация
ТЕСТЫ КАК СПЕЦИФИКАЦИЯ[TestFixture]
public class Superman_Should
{
[Test]
public void SaveKittenFromTree()
{
…
superman.Act();
Assert.That(kitten.IsSaved());
}
[Test]
public void WearRedBlueSuit_WhenAtWork()
{
…
}
…
}
4. Тесты как спецификация
ТЕСТЫ КАК СПЕЦИФИКАЦИЯ[TestFixture]
public class Superman_Should
{
[Test]
public void SaveKittenFromTree()
{…}
[Test]
public void WearRedBlueSuit_WhenAtWork()
{…}
}
5. Имя теста как спецификация
ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯЧТО ДОЛЖНО БЫТЬ В ИМЕНИ ТЕСТА?
System Under Test
имя класса, имя метода
Условия
вход, состояние
Результат
ожидаемое поведение или требования для проверки
http://java.dzone.com/articles/7-popular-unit-test-naming
6. Имя теста как спецификация
ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯParserTests.TestParse
ParserTests.Parse_Fails
ParserTests.Parse_BigNumbers
ParserTests.Parse_NumbersGreaterThanMaxInt
ParserTests.Fails_OnNegativeNumbers
7. Имя теста как спецификация
ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯIsAdult_AgeLessThan18_False
ParseInt_Should.Fails_OnNonNumber
Stack_Should.BeEmpty_AfterCreation
When_MandatoryFieldsAreMissing_Expect_StudentAdmissionToFail
8. Имя теста как спецификация
ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯ9. Имя теста как спецификация
ИМЯ ТЕСТА КАК СПЕЦИФИКАЦИЯSAMPLES / SPECIFICATIONS / STACK_SPECIFICATION.CS
10. Правильная структура теста
ПРАВИЛЬНАЯ СТРУКТУРА ТЕСТАArrange
Act
Assert
SAMPLES / AAA / ZIP_SHOULD.CS
11. Антипаттерны
АНТИПАТТЕРНЫSAMPLES / ANTIPATTERNS
https://habr.com/post/43761/
12. Почему не все пишут тесты?
ПОЧЕМУ НЕ ВСЕ ПИШУТ ТЕСТЫ?13. пишем тесты легко
ТЕСТ НАПИСАТЬ – КАК ЧАЙ ПОПИТЬПИШЕМ ТЕСТЫ ЛЕГКО
14. БОРЬБА С ДУБЛИРОВАНИЕМ
15. Сборка и разборка окружения
СБОРКА И РАЗБОРКА ОКРУЖЕНИЯ[OneTimeSetUp|OneTimeTearDown]
[SetUp|TearDown]
16. SetUp & TearDown
SETUP & TEARDOWN[TestFixture]
public class Mailbox_Should
{
private Mailbox mailbox;
[SetUp]
public void SetUp() { mailbox = new Mailbox(); }
...
[TearDown]
public void TearDown() { mailbox.Dispose(); }
}
17. Object Mother & Test Data Builder
OBJECT MOTHER & TEST DATA BUILDERSAMPLES / TESTDATABUILDER / TESTDATABUILDER.CS
18. Parametrized tests
PARAMETRIZED TESTSОНИ ЖЕ DATA DRIVEN
SAMPLES / PARAMETRIZED / DOUBLE_SHOULD.CS
19. Дополнительные трюки
ДОПОЛНИТЕЛЬНЫЕ ТРЮКИ20. Assert
ASSERTAssert.AreEqual(expected, actual)
VS
Assert.AreEqual(actual, expected)
Assert.That(2+2, Is.EqualTo(4))
Assert.That(x, IResolveConstraint) // O_o ?!?
21. Should
SHOULD(2+2).Should().Be(4)
flag.Should().BeTrue()
new[] {1,2,3}
.Should().AllBeEquivalentTo(new [] {3,2,1});
new[] {1,2,3}
.Should().AllBeEquivalentTo(
new [] {1,2,3},
options => options.WithStrictOrdering());
FluentAssertions доступна через NuGet
22. Ожидание исключения
ОЖИДАНИЕ ИСКЛЮЧЕНИЯAction action = () => { var z = x / y; };
action.ShouldThrow<DivideByZeroException>();
23. Ограничение по времени
ОГРАНИЧЕНИЕ ПО ВРЕМЕНИ[Test, Timeout(1000)]
public void ShouldDoInTimeout()
{
…
}
24. Выбор тестов для прогона
ВЫБОР ТЕСТОВ ДЛЯ ПРОГОНА[Test, Category("Smokie")]
public void Test()
{
…
}
25. Live Templates
LIVE TEMPLATESResharper → Tools → Templates Explorer
Import tests-templates.DotSettings
tf — TestFixture
tt — Test
su — SetUp
td — TearDown
26. HotKeys
HOTKEYSCtrl+T+R
Ctrl+U+R
27. challenge
CHALLENGE28. cHALLENGE
CHALLENGEWordsStatistics
WordStatisticsXXX
Ctrl+F5
CHALLENGE / WORDSSTATISTICS_TESTS.cs
29. CHALLENGE
РАЗБОРТесты по спецификации — это просто
Как взаимодействуют разные пункты спецификации?
30. CHALLENGE
РАЗБОРВажен не только результат, но и время выполнения
31. CHALLENGE
РАЗБОРТесты не заменяют Code Review
Code Review не заменяет тесты
32. CHALLENGE
РАЗБОРБольшие цифры в лидерборде — плохо
Overspecification
Программное обеспечение