Регресионо тестирање у мобилном развоју — шта је то, врсте и како се спроводи

Аутор: IT Sectr Објављено: 2026-04-07 Време читања: 8 мин

Регресионо тестирање је процес поновне провере апликације након уношења измена ради откривања дефеката у раније радећој функционалности. Свака измена кода — нова функционалност, исправка грешке или рефакторинг — може ненамерно покварити постојеће могућности апликације. Регресиони тестови аутоматизују проверу да је стара функционалност остала исправна. Према истраживању IBM, 2023, регресионо тестирање обухвата од 30 до 70% свих извршених тестова у комерцијалним продуктним тимовима, што наглашава његову улогу као главне баријере против производних инцидената.

Главно

  • Регресионо тестирање — провера апликације након измена, која гарантује да постојећа функционалност наставља да ради исправно.
  • Потпун регресиони прогон покреће све постојеће тестове пројекта и траје од 30 минута до неколико сати у зависности од величине сета.
  • Селективно регресионо тестирање покреће само тестове повезане са измењеним кодом, смањујући време прогона за 60–80%.
  • CI/CD интеграција је обавезна: регресиони тестови се извршавају аутоматски при сваком pull request-у и пре издања.
  • Пирамида тестирања препоручује 70% модуларних тестова у регресионом сету за баланс брзине и дубине покривености.

Шта је регресионо тестирање?

Регресионо тестирање је врста тестирања усмерена на потврду да измене у коду нису нарушиле постојећу функционалност. Термин „регресија“ значи повратак у горе стање — када функција која је радила у претходној верзији престане да ради у новој. Регресиони тестови се извршавају више пута у сваком развојном циклусу, што их разликује од тестова нове функционалности који се пишу једнократно.

Потреба за регресионим тестирањем произилази из ефекта каскадних измена: исправка грешке у једном модулу може решити проблем, али покварити суседну функционалност која је зависила од њега. На пример, измена SQL упита у репозиторијуму корисника може убрзати пријаву, али покварити извоз података који је користио исти упит. Регресиони тест извоза података откриће ово кршење пре издања.

Према извештају CISQ 2023, цена исправке регресионог дефекта откривеног у производњи је 15 пута већа него у фази аутоматизованог регресионог прогона. Компаније које инвестирају у аутоматизовано регресионо тестирање смањују удео регресионих дефеката у издањима са 25% на 5% у року од годину дана након имплементације, према Capgemini World Quality Report.

Врсте регресионог тестирања

Постоји неколико приступа регресионом тестирању који се разликују по обиму и критеријумима одабира тестова. Избор приступа зависи од величине пројекта, учесталости измена и доступног времена у CI цевоводу. Испод су наведене главне врсте регресионог тестирања са њиховим карактеристикама.

Потпуно регресионо тестирање

Потпун регресиони прогон извршава све аутоматизоване тестове пројекта без изузетка. Овај приступ даје максималну сигурност, али захтева значајне рачунарске ресурсе и време. Потпун прогон се извршава пре великих издања — једном у 2–4 недеље. За апликацију са 5000 тестова, потпун прогон траје од 2 до 6 сати у зависности од инфраструктуре.

Селективно регресионо тестирање

Селективни приступ покреће само тестове повезане са измењеним модулима. За утврђивање повезаности користи се анализа зависности на нивоу кода: ако је измењена класа UserRepository, покрећу се тестови који зависе од UserRepository директно или транзитивно. Алати Jacoco, Android Test Coverage и Xcode Code Coverage пружају мапе покривености за прецизан одабир. Селективни прогон се извршава на сваки pull request и траје 5–15 минута.

Регресија заснована на ризику

Risk-based регресија рангира тестове по критичности функционалности и вероватноћи лома. Критичне функције — плаћање, ауторизација, синхронизација — тестирају се при свакој измени кода. Помоћне функције — екран „О апликацији“, анимације — тестирају се само пре издања. Рангирање се преиспитује квартално на основу података о производним инцидентима.

Чим се регресионо тестирање разликује од ретеста

Често се појмови регресионог тестирања и ретеста мешају, иако су то различити процеси. Ретест је поновно покретање одређеног теста који је раније пао, након исправке дефекта. Циљ ретеста је да се увери да исправка ради: грешка се више не репродукује. Ретест се извршава једнократно, одмах након поправке и потврде поправке од стране програмера.

Регресионо тестирање је покретање тестова на постојећу функционалност која НИЈЕ мењана. Циљ је да се увери да исправка једног дефекта није створила нови дефект на другом месту. Регресиони тестови се покрећу више пута у сваком развојном циклусу, независно од тога које су конкретне грешке поправљане. Главна разлика: ретест проверава саму поправку, регресија проверава последице поправке.

У CI/CD цевоводу оба процеса се извршавају секвенцијално. Након спајања pull request-а, покреће се ретест конкретне грешке, а затим потпун или селективни регресиони прогон. Према SmartBear (2022), раздвајање ових процеса смањује време дијагностике неуспелих CI прогона за 30%, јер тим одмах види који део дефеката је повезан са регресијом, а који са нерадећим поправкама.

Аутоматизација регресионог тестирања

Аутоматизација регресионог тестирања је критичан фактор успеха за савремене мобилне пројекте. Ручно регресионо тестирање није скалабилно: при сету од 200 тестова за један прогон потребно је 2–3 радна дана QA инжењера, што онемогућава дневне прогоне. Аутоматизовани регресиони тестови се извршавају за 10–60 минута без учешћа човека, што омогућава покретање при сваком комиту или pull request-у.

  • Модуларни тестови — основа регресионог сета (70%). Извршавају се за секунде, не захтевају емулатор, дају прецизну индикацију сломљене класе.
  • Интеграциони тестови — други ниво (20%). Проверавају мрежни слој, базу података и системске сервисе са контролисаним зависностима.
  • UI и E2E тестови — врх пирамиде (10%). Покривају критичне корисничке сценарије: регистрацију, плаћање, синхронизацију.

За одржавање регресионог сета у ажурном стању користи се тест аналитика: алати попут Allure, ReportPortal и Xray прате проценат проласка, трајање и стабилност сваког теста. Тестови чија стабилност пада испод 90% (често се ломе због измена у захтевима) означавају се као legacy и упућују се на преиспитивање власнику.

Пример подешавања регресионог теста

Размотримо подешавање аутоматизованог регресионог теста на Android-у коришћењем библиотеке JUnit 5 и Espresso. Пример демонстрира селективну регресију — тест проверава да након рефакторинга репозиторијума корисника није покварен екран профила. За iOS се користи XCTest са аналогном логиком — понављајући тест на кључном сценарију.

Android: регресиони тест профила

Тест користи MockWebServer за емулацију сервера и проверава пун пут: учитавање података о кориснику, приказ на екрану профила и обраду грешке када сервер није доступан. Такви тестови се укључују у регресиони сет и извршавају при свакој измени у module-profile.

kotlin
@RunWith(AndroidJUnit4::class)
class ProfileRegressionTest {

    @get:Rule
    val composeRule = createComposeRule()

    @Test
    fun profileScreen_rendersCorrectly() {
        val user = User(id = 1, name = "Alice", email = "alice@test.com")
        composeRule.setContent {
            ProfileScreen(user)
        }
        composeRule.onNodeWithText("Alice").assertIsDisplayed()
        composeRule.onNodeWithText("alice@test.com").assertIsDisplayed()
    }

    @Test
    fun profileScreen_handlesNetworkError() {
        setNetworkError()
        composeRule.onNodeWithText("Greška učitavanja").assertIsDisplayed()
    }
}

iOS: регресиони тест са XCTest

За iOS регресиони тест користи XCTestExpectation за асинхрону проверу ажурирања UI након добијања података од API-ја. Тест емулира мрежни одговор и проверава да су UI елементи ажурирани исправно.

swift
class ProfileRegressionTests: XCTestCase {
    func testProfileScreen_rendersCorrectly() {
        let viewModel = ProfileViewModel(userId: 1)
        let view = ProfileView(viewModel: viewModel)
        viewModel.loadProfile()

        let expectation = expectation(description: "profile loaded")
        viewModel.onProfileLoaded = {
            XCTAssertEqual(viewModel.userName, "Alice")
            XCTAssertEqual(viewModel.userEmail, "alice@test.com")
            expectation.fulfill()
        }
        waitForExpectations(timeout: 3.0)
    }
}

Стратегија изградње регресионог сета

Изградња ефикасног регресионог сета је итеративни процес заснован на подацима о дефектима и изменама кода. Примарна стратегија — укључити све постојеће тестове у регресиони сет и покретати пун прогон пре сваког издања. Како тест база расте (преко 2000 тестова), пун прогон постаје предуг и захтева се селективни приступ.

Друга фаза — увођење алата за анализу зависности: Jacoco за Android, Xcode Test Plan за iOS. Ови алати граде мапу „тест — класа — метод“ и омогућавају одређивање који тестови су погођени одређеном изменом. Селективни прогон заснован на анализи покривености смањује време извршења за 60–80% уз задржавање 95% ефикасности откривања регресија, према Spotify Engineering (2022).

Трећа фаза — континуирани мониторинг и оптимизација. Тестови који нису пали 6 месеци премештају се у нископриоритетни сет. Тестови који падају чешће од једном месечно су кандидати за преиспитивање: или хватају стварне проблеме (захтевају поправку), или су превише крхки (захтевају стабилизацију). Квартална ревизија регресионог сета је стандардна пракса за одржавање његове ефикасности и брзине извршења.

Често постављана питања

Колико често треба покретати регресионе тестове?

Селективни регресиони прогон — на сваки pull request. Потпун регресиони прогон — пре сваког издања и недељно (nightly build). Кључно правило: што чешће покретање, то брже се откривају регресије и нижа је цена њихове поправке. За критичне пројекте могућа је пуна регресија при сваком спајању.

Које тестове укључити у регресиони сет?

Све модуларне тестове (основна регресија), интеграционе тестове на кључне компоненте и UI тестове на критичне корисничке сценарије. Не укључујте тестове експерименталне функционалности, тестове са flakiness-ом изнад 10% и тестове који захтевају ручно окружење.

Како одржавати регресиони сет у ажурном стању?

Уклањајте тестове уклоњене функционалности, ажурирајте тестове при промени захтева, квартално спроводите ревизију сета. CI аналитика — Allure, ReportPortal — помаже да се идентификују тестови који су изгубили актуелност: ако тест 3 месеца није мењан и није пао, кандидат је за уклањање из дневног прогона.

Како скратити време регресионог прогона?

Користите паралелно покретање тестова на више уређаја, уведите селективну регресију засновану на анализи покривености измењеног кода, искључите визуелне снимке за нерелевантне екране. Циљано време селективног прогона — 5–10 минута, потпуног — не више од 2 сата.

Да ли је регресионо тестирање само аутоматизација?

Не, регресионо тестирање укључује и ручне провере: истраживачко тестирање након издања, UX регресију и проверу приступачности након промене интерфејса. Аутоматизација покрива 70–80% регресионих провера; преосталих 20–30% су ручни тестови, фокусирани на сценарије које није могуће или је прескупо аутоматизовати.

Резиме

  • Регресионо тестирање — вишеструка провера постојеће функционалности након сваке измене кода ради откривања ненамерних ломова.
  • Потпун регресиони прогон даје максималну сигурност пре издања; селективни — извршава се на сваки pull request, штедећи 60–80% времена.
  • Ретест проверава конкретну поправку; регресија проверава да поправка није ништа покварила около — то су различити процеси у CI/CD цевоводу.
  • Пирамида тестирања за регресију: 70% модуларних, 20% интеграционих, 10% UI и E2E тестова.
  • Селективна регресија заснована на анализи покривености (Jacoco, Xcode Test Plan) скраћује време прогона без губитка квалитета.
  • Квартална ревизија сета тестова и CI аналитика одржавају ефикасност регресионог тестирања.
  • Аутоматизација покрива 70–80% регресионих провера; ручни тестови допуњују аутоматизацију за истраживачко и UX тестирање.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође