Перейти к содержимому

Фотография

Многопоточность в программном тестировании

тест многопоточность

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 skifzp

skifzp

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Максим Шолудько

Отправлено 11 июня 2020 - 19:15

Доброго времени!

 

Я недавно закончил курс Баранцева "Java программирование для тестировщика", где меня зацепила фраза лектора, что все тесты нашего рабочего проекта мы можем запускать в многопоточном режиме, но сам подход нам дали на самостоятельное изучение.

 

Прошу знатоков этого вопроса ответить на правильность моих суждений в части реализации (TestNG) и применимости.

 

Реализация -> все тестовые классы наследуются от БазовогоКласса, в котором было:

 

protected static final AppManager app = new AppManager(System.getProperty("browser",BrowserType.FIREFOX));

@BeforeClass(alwaysRun = true)
public void setUp(ITestContext context) throws Exception {
app.init();
context.setAttribute("app",app());
}

@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
app.stop();
}

 

ниже, мои переделки для многопоточного запуска:

 

private static ThreadLocal<AppManager> thread = new ThreadLocal<AppManager>();

public static AppManager app() {
   return thread.get();
}

@BeforeClass(alwaysRun = true)
public void setUp(ITestContext context) throws Exception {
   //System.out.println(Thread.currentThread().getName());
   thread.set(new AppManager(System.getProperty("browser",BrowserType.FIREFOX)));
   app().init();
   context.setAttribute("app",app());
}

@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
   app().stop();
}

 

Плюс я настроил запуск нескольких потоков через xml

 

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >

<suite name="Suite1" verbose="1" parallel="classes" thread-count="3">
       <test name="Contacts">
           <classes>
                 <class name="il.javatesting.addressbook.tests.ContactCreation" />
                 <class name="il.javatesting.addressbook.tests.ContactDelete" />
                <class name="il.javatesting.addressbook.tests.ContactModification" />
           </classes>
       </test>
</suite>

 

Проблемы с которыми я столкнулся: есть множество тестов, которые на выходе делают сверку состояния всей базы до ТЕСТА с состоянием  после ТЕСТА с учетом изменений(поменяли имя, значит проверяем имена всех пользователей до этого изменения с учетом того, что этот пользователь уже с другим именем). !!! НО, если все течет в многопоточности, то за время ТЕСТА могут пробежаться другие тесты и , конечно , такая проверка не пройдет.

 

Отсюда вопрос, для чего нужна многопоточность в тестах (только, чтобы узнать предельные нагрузки, хотя как это реализовать без облака?), или у меня неверный подход к многопоточности?

 

Заранее благодарен за ответ по части реализации и применимость многопоточного тестирования


  • 0

#2 Сергей

Сергей

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 245 сообщений
  • Город:Москва

Отправлено 11 июня 2020 - 20:58

Наверное, вам стоит пройти курсы по тест-дизайну.
  • 0

"Если ты хороший плотник и делаешь красивую тумбочку, ты не будешь прибивать сзади фанеру, даже несмотря на то, что задняя часть повернута к стене, и никто ее не видит. Ты будешь хорошо спать ночью, только если тебе удалось воплотить в своем произведении эстетическую красоту и качество." © Стив Джобс


#3 skifzp

skifzp

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Максим Шолудько

Отправлено 12 июня 2020 - 05:48

Наверное, вам стоит пройти курсы по тест-дизайну.

Можете раскрыть более подробнее ваш ответ?


  • 0

#4 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 12 июня 2020 - 07:42

Разве из вашего сообщения не понятно, что тесты что оперируют одними сущностями в БД не стоит запускать в параллели?

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

Вам-то зачем многопоточность?


  • 0

#5 skifzp

skifzp

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Максим Шолудько

Отправлено 12 июня 2020 - 12:02

Разве из вашего сообщения не понятно, что тесты что оперируют одними сущностями в БД не стоит запускать в параллели?

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

Вам-то зачем многопоточность?

Для саморазвития :)

 

1. Оптимизация времени выполнения тестов

2. Проверка стрессоустойчивости back-end


  • 0

#6 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 12 июня 2020 - 15:43

Второй пункт делается другими средствами, обсуждается тут - https://software-tes...izvoditelnosti/


  • 1

#7 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 12 июня 2020 - 22:42

Доброго времени!

 

Я недавно закончил курс Баранцева "Java программирование для тестировщика", где меня зацепила фраза лектора, что все тесты нашего рабочего проекта мы можем запускать в многопоточном режиме, но сам подход нам дали на самостоятельное изучение.

 

Прошу знатоков этого вопроса ответить на правильность моих суждений в части реализации (TestNG) и применимости.

 

Реализация -> все тестовые классы наследуются от БазовогоКласса, в котором было:

 

protected static final AppManager app = new AppManager(System.getProperty("browser",BrowserType.FIREFOX));

@BeforeClass(alwaysRun = true)
public void setUp(ITestContext context) throws Exception {
app.init();
context.setAttribute("app",app());
}

@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
app.stop();
}

 

ниже, мои переделки для многопоточного запуска:

 

private static ThreadLocal<AppManager> thread = new ThreadLocal<AppManager>();

public static AppManager app() {
   return thread.get();
}

@BeforeClass(alwaysRun = true)
public void setUp(ITestContext context) throws Exception {
   //System.out.println(Thread.currentThread().getName());
   thread.set(new AppManager(System.getProperty("browser",BrowserType.FIREFOX)));
   app().init();
   context.setAttribute("app",app());
}

@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
   app().stop();
}

 

Плюс я настроил запуск нескольких потоков через xml

 

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >

<suite name="Suite1" verbose="1" parallel="classes" thread-count="3">
       <test name="Contacts">
           <classes>
                 <class name="il.javatesting.addressbook.tests.ContactCreation" />
                 <class name="il.javatesting.addressbook.tests.ContactDelete" />
                <class name="il.javatesting.addressbook.tests.ContactModification" />
           </classes>
       </test>
</suite>

 

Проблемы с которыми я столкнулся: есть множество тестов, которые на выходе делают сверку состояния всей базы до ТЕСТА с состоянием  после ТЕСТА с учетом изменений(поменяли имя, значит проверяем имена всех пользователей до этого изменения с учетом того, что этот пользователь уже с другим именем). !!! НО, если все течет в многопоточности, то за время ТЕСТА могут пробежаться другие тесты и , конечно , такая проверка не пройдет.

 

Отсюда вопрос, для чего нужна многопоточность в тестах (только, чтобы узнать предельные нагрузки, хотя как это реализовать без облака?), или у меня неверный подход к многопоточности?

 

Заранее благодарен за ответ по части реализации и применимость многопоточного тестирования

1. тест должен работать на непустой базе с непротиворечивыми данными.

2. для обеспечения уникальности данных должен быть единый сервис для генерации тестовых данных, в основном  айдишников., ни один тест не должен содержать каких либо захардкоженных данных.


  • 0

#8 skifzp

skifzp

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Максим Шолудько

Отправлено 13 июня 2020 - 15:18

Второй пункт делается другими средствами, обсуждается тут - https://software-tes...izvoditelnosti/

 

Спасибо! 


  • 0

#9 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 23 июня 2020 - 08:02

Отсюда вопрос, для чего нужна многопоточность в тестах (только, чтобы узнать предельные нагрузки, хотя как это реализовать без облака?), или у меня неверный подход к многопоточности?

 

Функциональные тесты мало годятся для того, чтобы узнать предельные нагрузки, это другая область тестирования с другими инструментами, особенностью которых является умение запускать много однотипных потоков, а запуск функциональных тестов в параллельных потоках преследует другие цели, главная из которых -- ускорить выполнение тестов за счёт более эффективного использования ресурсов. Современные процессоры имеют обычно несколько ядер, а при выполнении тестов в один поток задействуется только одно ядро. Поэтому параллельный запуск (теоретически) способен ускорить выполнение во столько раз, сколько ядер имеет ваш процессор. Кроме того, иногда тесты вроде бы выполняются, но на самом деле процессор не задействуют, потому что чего-то ожидают, например, ответа от сервера. В это время мог бы выполняться какой-то другой тест, используя свободные ресурсы процессора, и при параллельном запуске это действительно происходит, а при запуске в один поток свободные ресурсы процессора просто будут отданы каким-то другим задачам, не связанным с выполнением ваших тестов.

 

Проблемы с которыми я столкнулся: есть множество тестов, которые на выходе делают сверку состояния всей базы до ТЕСТА с состоянием  после ТЕСТА с учетом изменений(поменяли имя, значит проверяем имена всех пользователей до этого изменения с учетом того, что этот пользователь уже с другим именем). !!! НО, если все течет в многопоточности, то за время ТЕСТА могут пробежаться другие тесты и , конечно , такая проверка не пройдет.

 

Да, при параллельном выполнении тесты придётся спроектировать таким образом, чтобы они не влияли друг на друга. Нужно будет учесть это и при подготовке тестовых данных, и при реализации проверок ("массовые" проверки в этом случае придётся заменить на более "точечные")


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium



Темы с аналогичным тегами тест, многопоточность

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных