Sobes.tech
Junior

Разкажете ми за натоварващите тестове.

sobes.tech AI

Отговор от AI

Тестовете за натоварване са вид тестове, насочени към определяне на производителността, стабилността и скалируемостта на приложението (системата) при различни натоварвания.

Задачи на тестовете за натоварване:

  • Определяне на максималното натоварване, което системата може да издържи.
  • Откриване на "тесни места" (bottlenecks).
  • Оценка на времето за реакция на системата при зададено натоварване.
  • Проверка на стабилността на системата в дългосрочен план при натоварване.
  • Тестиране на скалируемостта на системата.

Видове тестове за натоварване:

  • Тест за натоварване (Load Testing): Проверка на поведението на системата при очаквано (рутинно) ниво на натоварване.
  • Стрес тест (Stress Testing): Проверка на системата при натоварване, превишаващо рутинното, до възникване на сривове. Цел - определяне на пределната издръжливост.
  • Тест за издръжливост/дълготрайност (Endurance/Soak Testing): Проверка на стабилността на системата при дългосрочно въздействие на средно или високо натоварване, откриване на течове на памет, деградация на производителността с времето.
  • Пиково натоварване (Spike Testing): Проверка на поведението на системата при рязко, еднократно увеличение на натоварването.
  • Тест за скалируемост (Scalability Testing): Оценка на способността на системата да обработва нарастващ обем натоварване чрез хоризонтално или вертикално мащабиране на ресурсите.
  • Тест за обем (Volume Testing): Проверка на поведението на системата при увеличаване на обема на данните в базата данни или други хранилища.

Етапи на провеждане на тестовете за натоварване:

  1. Определяне на целите: Ясно определяне на метриките за производителност (време за реакция, пропускателна способност, брой грешки) и критерии за успех.
  2. Планиране и проектиране на сценарии: Анализ на потребителските сценарии, определяне на профила на натоварването (броя виртуални потребители, интензивност на заявките).
  3. Разработка на тестови скриптове: Написване на скриптове за имитация на действия на потребителите с използване на инструменти за натоварване.
  4. Подготовка на тестовата среда: Настройка на тестовата среда, имитираща работната среда.
  5. Изпълнение на тестовите пробези: Стартиране на тестове с различно натоварване.
  6. Мониторинг и събиране на данни: Събиране на метрики за производителността на системата, сървърите, базите данни.
  7. Анализ на резултатите и отчетност: Сравняване на получените резултати с целевите метрики, откриване на проблеми, подготовка на отчет.

Инструменти за натоварване:

  • JMeter
  • LoadRunner
  • Gatling
  • k6
  • Locust

Пример за прост скрипт за JMeter (HTTP Request):

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Пример за натоварване">
      <hashTree>
        <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group">
          <intProp name="ThreadGroup.num_threads">100</intProp>
          <intProp name="ThreadGroup.ramp_time">10</intProp>
          <longProp name="ThreadGroup.duration">60</longProp>
          <boolProp name="ThreadGroup.scheduler">true</boolProp>
          <hashTree>
            <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request">
              <stringProp name="HTTPSampler.domain">example.com</stringProp>
              <stringProp name="HTTPSampler.path">/</stringProp>
              <stringProp name="HTTPSampler.method">GET</stringProp>
              <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
              <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
              <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
              <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
              <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">false</boolProp>
              <boolProp name="HTTPSampler.embedded_url_report">true</boolProp>
              <boolProp name="HTTPSampler.connect_timeout"></boolProp>
              <boolProp name="HTTPSampler.response_timeout"></boolProp>
              <stringProp name="HTTPSampler.protocol">https</stringProp>
              <stringProp name="HTTPSampler.contentEncoding"></stringProp>
              <stringProp name="HTTPSampler.comment"></stringProp>
              <stringProp name="HTTPSampler.port"></stringProp>
              <stringProp name="HTTPSampler.image_parser">true</stringProp>
              <stringProp name="HTTPSampler.concurrentDwn">Both</stringProp>
              <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
              <stringProp name="HTTPSampler.implementation_status">OK</stringProp>
              <boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
              <listProp name="HTTPSampler.HTTP_HEADERS"></listProp>
            </HTTPSamplerProxy>
            <hashTree/>
          </hashTree>
        </hashTree>
      </hashTree>
    </TestPlan>
  </hashTree>
</jmeterTestPlan>

Метрички, събирани при натоварващо тестуване:

  • Време за реакция (Response Time)
  • Пропускателна способност (Throughput)
  • Брой грешки на секунда (Errors per Second)
  • Брой заявки на секунда (Requests per Second / Transactions per Second)
  • Използване на CPU (CPU Utilization)
  • Използване на памет (Memory Usage)
  • Активност на твърдия диск (Disk I/O)
  • Мрежова активност (Network I/O)
  • Метрики на базата данни (броя заявки, времето за изпълнение на заявки)

Тестовете за натоварване помагат да се предотврати сривът на системата в продукция при високо натоварване и да се осигури приемливо ниво на качество за крайните потребители.