Несколько лет назад, примерно в то же время, когда я начал проводить тренинг «Быстрое тестирование ПО» (Rapid Software Testing), мой соавтор Джеймс Бах (James Bach) записал видео для демонстрации быстрого стресс-тестирования. В его примере подход заключался в подаче на вход визарда приложения огромного объема данных, по существу заставляя приложение нагружать само себя.
Видео длится почти шесть минут. Примерно на середине Джеймс спрашивает: «Вы можете поинтересоваться, почему я не хочу остановиться сейчас. Причина в том, что мы наблюдаем неуклонное ухудшение ситуации. Мы могли бы остановиться сейчас, но возможно мы увидим нечто худшее, если будем продолжать». Таким образом, он продолжил тест. А вскоре после этого Джеймс предложил эвристики для остановки: мы останавливаемся, когда: 1) мы обнаружили достаточно серьезную проблему, или 2) в поведении программы нет явных изменений – программа в целом работает стабильно, или 3) ценность от продолжения теста не оправдывает стоимость. Таковы были эвристики для остановки того теста.
Где-то через год после того, как я впервые увидел это видео, я решил более полно описать эвристики для прекращения тестирования в колонке для журнала «Better Software». По этому поводу мы с Джеймсом устроили транспективную беседу. Колонку вы можете найти здесь. Ещё год спустя колонка превратилась в неформальную лекцию, которую я прочитал в нескольких местах.
Примерно через шесть месяцев после этого мы оба нашли еще больше эвристик для остановки тестирования. Мы обсуждали их на STAR East 2009, и проходившие в тот момент мимо нас Дэйл Эмери (Dale Emery) и Джеймс Линдсей (James Lyndsay) присоединились к дискуссии. В частности, Дэйл высказал предположение, что во время сражения стрельба может быть остановлена в нескольких случаях: временное затишье, поступление команды «прекратить огонь», соглашение между сторонами о прекращении огня, отход сторон на начальные позиции, разоружение противника. Это показалось мне интересным.
В общем, сейчас я расскажу все эвристики, которые мы нашли. Я подчеркиваю, что эти эвристики для остановки являются именно эвристиками. Эвристики – это быстрые, недорогие способы решения проблемы или принятия решения. Эвристики подвержены ошибкам, то есть они могут как сработать, так и не сработать. Эвристики недостаточно абстрактны, они могут перекрываться и пересекаться друг с другом. Также эвристики зависят от контекста, поэтому предполагается, что они будут использоваться людьми, имеющими знания и навыки для их разумного использования. Ниже я перечислил эвристики и для каждой из них указал некоторые вопросы, при помощи которых можно проверить правомочность её использования.
Failed to mail the specified entities; Failed to mail the specified entities; Failed to send mail to 12345@mail.com; Mail Service not initialized.;
Error Code: 1049
Stack Trace: com.mercury.optane.core.CTdException: Mail Service not initialized. at com.mercury.optane.core.mail.CMailService.getInstance(CMailService.java:222) at com.mercury.td.tdserver.tdutil.CTdServerGeneralFunctions.getMailService(CTdServe rGeneralFunctions.java:2401) at com.mercury.td.tdserver.api.logics.CMailLogic.sendMail(CMailLogic.java:473) wrapped in com.mercury.optane.core.CTdException: Failed to send mail to Igor.Shvakov@ge.com at com.mercury.td.tdserver.api.logics.CMailLogic.sendMail(CMailLogic.java:481) at com.mercury.td.tdserver.api.logics.CMailLogic.sendEntity(CMailLogic.java:436) wrapped in com.mercury.optane.core.CTdException: Failed to mail the specified entities at com.mercury.td.tdserver.api.logics.CMailLogic.sendEntity(CMailLogic.java:439) at com.mercury.td.tdserver.api.logics.CMailLogic.sendEntity(CMailLogic.java:328) wrapped in com.mercury.optane.core.CTdException: Failed to mail the specified entities at com.mercury.td.tdserver.api.logics.CMailLogic.sendEntity(CMailLogic.java:345) at com.mercury.td.web.server.CTdServlet.redirectMailEntity(CTdServlet.java:1086) at sun.reflect.GeneratedMethodAccessor178.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav a:25) at java.lang.reflect.Method.invoke(Method.java:324) at com.mercury.optane.core.web.CAbsServlet.executeFunction(CAbsServlet.java:554) at com.mercury.optane.core.web.CAbsServlet.processRequest(CAbsServlet.java:535) at com.mercury.td.web.server.CTdServlet.processRequest(CTdServlet.java:319) at com.mercury.optane.core.web.CAbsServlet.doPost(CAbsServlet.java:418) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt erChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:8 1) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt erChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:2 13) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:1 78) at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.j ava:39) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociatio nValve.java:153) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogVa lve.java:481) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107 ) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:52 7) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.j ava:112) at java.lang.Thread.run(Thread.java:534)
В чем проблема? где что не так?
AutomatedQA - Functional Testing -> Как вывести все пункты меню в log
2010-02-24 16:33 natavmor
Здравствуйте, я новичок в этом деле и поэтому хочу обратиться с вопросом. Мне дали задачу, вывести содержимое меню в log/ Например в программе Total Comander есть меню File, если его нажать то, там много пунктов, которые мне надо вывести построчно в лог. Я понимаю, что нужно организовать цикл, а вот какую функцию использовать не знаю. Заранее спасибо.
Вариант автоматизации первый [codebox] //нажатие кнопки window = Sys.Process("iexplore").Window("IEFrame", "*").Page("*").ToURL("http://бла-бла-бла.ру") window.document.all.item(162).Click(); //обработка конфёрма Sys.Process("iexplore").Window("#32770", "Microsoft Internet Explorer").Window("Button", "ОК").Click()[/codebox] работает без проблем. За исключением одного "но" - меня не устраивает item(162)
Вариант второй [codebox] //нажатие кнопки //массив объектов-кнопок на странице window = Sys.Process("iexplore").Window("IEFrame", "*").Page("*").ToURL("http://бла-бла-бла.ру") InputItems = window.document.getElementsByTagName("input");
for (var i=0; i<InputItems.length; i++) {//Ищем кнопку с заданным названием if (InputItems(i).value == "Кнопка") { InputItems(i).Click(); break; } } //обработка конфёрма Sys.Process("iexplore").Window("#32770", "Microsoft Internet Explorer").Window("Button", "ОК").Click()[/codebox] Здесь на кнопку мы нажимаем успешно, но до обработки конфёрма доехать не получается - просто висим и чего-то ждем, хотя окно конфёрма активно
Никто не сталкивался с ситуацией?
Обучение тестировщиков ПО -> Автоматизация функционального тестирования веб-приложений: хорошие пра
2010-02-24 23:08 barancev
Все, кто достаточно плотно соприкасался с автоматизацией тестов, знают, что если своевременно не позаботиться об аккуратной организации архитектуры тестового набора, тесты вскоре выйдут из под контроля -- добавление новых тестов и модификация существующих при изменении требований или реализации становятся серьёзной проблемой. Инструменты и фреймворки в какой-то мере пытаются решить эту задачу, они уже частично задают архитектурный каркас тестового набора. Но этого недостаточно, нужны дополнительные усилия со стороны разработчика тестов. Главный принцип, который знаком каждому программисту -- это повторное использование кода и стандартных архитектурных шаблонов. На семинаре мы будем рассматривать некоторые приёмы, которые применяются при автоматизации тестирования веб-приложений, но, вообще говоря, их с равным успехом можно использовать и для других классов приложений.
Всего в исследовании приняло участие 1600 участников. Мы публикуем обновленные результаты, которые отображают состояние дел в отрасли по общим показателям и описывают аудиторию исследования.
Общие данные об аудитории исследования и условиях труда:
Размер компании
Опыт работы в IT
Владение иностранным языком
Владение вторым иностранным языком
Образование
Страны респондентов
Детализация географии по регионам России
Детализация географии аудитории по крупным городам и странам (кроме России)
Детализация географии аудитории по регионам России
Всего в исследовании приняло участие 1600 участников. Мы публикуем обновленные результаты, которые отображают уровень зарплат менеджеров проектов. Аудитория исследования «Зарплаты в ИТ — 2009»
Зарплаты менеджеров проектов:
Зарплаты менеджеров проектов: Москва, Питер, Киев, Минск