Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

382 visualizaciones

Publicado el

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

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

Publicado en: Educación
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

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

×