Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

QA Fest 2017. Иван Пашко. Антипаттерны и запахи в автоматизации тестирования

307 views

Published on

Знакомо ощущение, когда смотрите на код, тест-кейc или на процесс - "здесь что-то не так"? Значит вы уловили этот запах - "test smells". К сожалению, не всегда понятно - от чего же он, и даже больше - что с ним делать. Непонимание, и как следствие, неверное применение хороших практик, собственные адаптации и приводят ошибкам, сложностям и еще большему усугублению проблемы.

В этом докладе, я поделюсь с вами своими мыслями и опытом. Как выглядят популярные проблемы, антипаттерны и запахи. Как их различить и что сделать, чтобы избавиться от них.

Published in: Education
  • Be the first to comment

  • Be the first to like this

QA Fest 2017. Иван Пашко. Антипаттерны и запахи в автоматизации тестирования

  1. 1. Антипаттерны и запахи в автоматизации тестирования QAFest - Kiev - 2017
  2. 2. О себе Follow me on Fb https://www.facebook.com/gr oups/1180099188730673/ Иван Пашко ● Scrum Master ● QA Automation Engineer ● 9+ лет в ИТ ● 0+ лет счастливый отец
  3. 3. Антипаттерны и запахи тестов ◎Личный опыт ◎Собеседования! ◎Форумы Соц. Сети ◎Конференции митапы
  4. 4. Антипаттерны Антипаттерны процесса автоматизации тестирования
  5. 5. Что такое анти-паттерн? Анти-паттерн - это распространенный подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным.
  6. 6. Причина возникновения антипаттернов Отсутствие: ◎ЖЕЛАНИЯ ◎ВРЕМЕНИ ◎ЗНАНИЯ *амбиции?..
  7. 7. #1 - Изолированная Автоматизация ◎ Изоляция от процесса тест-кейзов тест-плана регрессии
  8. 8. #2 - Ручная Автоматизация Выполняется вручную: ◎ Запуск ◎ Проверка состояния репорт ◎ Настройка тестового окружения
  9. 9. #3 - “Коварная” автоматизация Автоматизация полностью вытесняет ручное тестирование
  10. 10. #4 - Автоматизация на стероидах ◎“Сначала был фреймворк - сложный фреймворк”
  11. 11. ◎Автоматизация - инструмент: Выбирайте и применяйте с умом ◎Подружите автоматизацию с процессом тестирования! Что же делать?
  12. 12. Запахи тестов
  13. 13. Что такое запах теста? Тест (код) с запашком - термин, обозначающий признаки (запахи) проблем в системекодесценарие. Ключевые признаки необходимости рефакторинга.
  14. 14. #1 Неясный тест (Obscure test) Тест, который трудно понять с первого взгляда.
  15. 15. #2 Мучительный тест (Eager test) public void MakeVisaPayment() { // Create customer var customer = new Customer(); Assert.IsNotNull(customer); // Configure method var visaMethod = new PaymentMethod("VISA") { Limits = new Limits(5, 1000, "USD"); SetConfigurationGateway = "https://payment.visa.com"; }; Assert.IsTrue(visaMethod.GatewayPingIsOk()); // Link customer to method customer.AssignPaymentMethod(visaMethod); // MakePayment var result = customer.ProcessPayment( 100, "USD", "VISA"); //Check status Assert.AreEqual("OK", result.Status); } Вроде как проверка возможности платежа визой Зачем тогда эти проверки?
  16. 16. public void CheckVisaGatewayConfiguration() { // Create customer var customer = new Customer(); Assert.IsNotNull(customer); // Configure method var visaMethod = new PaymentMethod("VISA") { Limits = new Limits(5, 1000, "USD"); SetConfigurationGateway = "https://payment.visa.com"; }; Assert.IsTrue(visaMethod.GatewayPingIsOk()); // Link customer to method customer.AssignPaymentMethod(visaMethod); // MakePayment var result = customer.ProcessPayment( 100, "USD", "VISA"); //Check status Assert.AreEqual("OK", result.Status); } #2 Мучительный тест (Eager test) А зачем тогда эта проверка?
  17. 17. #3 Однострочный тест (Mystery Guest) [TestMethod] public void CheckVisaPayment() { DoPaymentTest("VISA"); } [TestMethod] public void CheckMasterCardPayment() { DoPaymentTest("MasterCard"); }
  18. 18. #4 Тест с ветвлениями [TestMethod] public void CheckPaymentChargeback() { var ppid = DoPaymentTest("VISA"); if (string.IsNullOrEmpty(ppid)) { MakePaymentRefund("VISA"); } }
  19. 19. Хороший тест - это баланс кода и документирования // Arrange var result = new DepositFlow() .ByMethod("VISA") .WithCreditCard("4111 1111 1111 1111") .WithAmount(100, "UAH") // Act .Submit(); // Assert Assert.AreEqual("OK", result.Status);
  20. 20. #5 Замусоривание Все что не относится к тесту или его интерпретации - мусор
  21. 21. #5.1 Дубликация-дублирование- повторение driver.FindElement(By.Name("q")).SendKeys( ... driver.FindElement(By.Name("btnK")).Click(); driver.FindElement(By.XPath("//div[@class= ... Дубликация не только в поведении.
  22. 22. #5.2 Комментарии - плохо // Строка для поиска const string tmp = "I want to join QAFest"; // Инициализация драйвера, не забудьте потом закрыть сессию var driver = new ChromeDriver(); // Переход на сайт-поисковик driver.Navigate().GoToUrl(new Uri("https://www.google.com.ua")); // Ввод в строку поиска driver.FindElement(OpenQA.Selenium.By.Name("q")).SendKeys( … // Нажатие кнопки поиска driver.FindElement(OpenQA.Selenium.By.Name("btnK")).Click();
  23. 23. #5.2 Комментарии - хорошо // Arrage const string SEARCH_STRING = "I want to join QAFest2017"; // Act var googlePage = new SearchPage() .WithUrl("https://www.google.com.ua"); var firstResult = googlePage.DoSearch(SEARCH_STRING).First(); // Assert Assert.AreEqual("qafest.com", firstResult);
  24. 24. #6 Код про запас, на будущее Пишем, и оставляем неиспользуемый код, авось когда-то пригодится
  25. 25. #7 Чрезмерная инициализация Использование сложных флоу / вызовы АПИ для инициализации состояния
  26. 26. #8 Общая инициализация Приводит к зависимым, хрупким и фантомные тестам
  27. 27. #9 Запахи в тестовых проверках Основа теста - его проверки
  28. 28. #9.1 Множественные проверки //Проверяем Int32 Assert.IsTrue(Int32.TryParse("1", out n)); Assert.AreEqual(1, Int32.Parse("1")); Assert.IsTrue(Int32.TryParse("-1", out n)); Assert.AreEqual(-1, Int32.Parse("-1")); .... //Мульти-проверки NUnit Assert.Multiple(() => { Assert.IsTrue(Int32.TryParse("-1", out n)); Assert.AreEqual(-1, Int32.Parse("-1")); }); А если мы упадем тут. Надо заново запускать тест...
  29. 29. #9.2 Запутанная проверка [TestMethod] public void TestInt32Parser() … Assert.IsTrue(Int32.TryParse("1", out n)); Assert.AreEqual(1, Int32.Parse("1")); //Граничные значения Assert.IsTrue(Int32.TryParse("2147483648", out n)); Assert.AreEqual(2147483648, Int32.Parse("2147483648")); //Переполнение буфера Assert.IsFalse(Int32.TryParse("2147483649", out n)); Assert.AreEqual(-2147483648, Int32.MaxValue + 1); Интересно, что же проверяет этот тест..
  30. 30. #9.3 Условная проверка // Assert if (searchResults.Count > 0) { Assert.AreEqual("http://qafest.com/", searchResults.First( … } else { var notFoundElm = driver.FindElement(OpenQA.Selenium.By.Id( … Assert.AreEqual("По запросу ничего не найдено. ", notFoundE … }
  31. 31. #9.4 Молчаливая проверка Assert.IsNotNull(user); Assert.IsTrue(IsShown); Assert.AreEqual(1, count); Assert.IsNotNull(user, "User doesn’t exist");
  32. 32. “ Good test is like a good joke - it needs no explanation
  33. 33. Мои характеристики хорошего теста: ◎Читаемый (Readability) ◎Поддерживаемый (Maintainability) ◎Полезный (Usability) ◎Гибкий (Flexibility)
  34. 34. СПАСИБО ЗА ВНИМАНИЕ Вопросы?
  35. 35. Полезности Join me in FB- Testing Jam

×