Engineering

Protected mobile app testing

How to test protected mobile builds before release: functional, performance and security layers, test-device exemptions and a release gate with named owners.

  • Android
  • iOS
  • Flutter
  • React Native
  • Test what ships

    Every verdict comes from the protected, signed build that users will install, never from an unprotected stand-in.

  • Three layers, one verdict

    Functional, performance and security-behaviour results feed a single release decision, recorded with the build.

  • Owners for bad days

    Acceptance, rollback and incident response each have a named owner before the first protected release goes out.

What Otukan brings to your test plan

Protection that is built to be tested, without weakening what ships.

  • Exemptions kept out of release

    Internal test builds can use their own protection profile. The release profile carries no test exemptions, and each build names the profile it used.

  • Observe-mode rehearsal

    Run controls in observe mode on a beta track to see what they report on real devices before any response is enforced.

  • Backend signal checks

    Prepared test devices produce signals your backend can receive, so server-side decisions are tested alongside the app.

  • Results with the build record

    Test outcomes sit next to the protection profile version and logs for that build, ready for release review.

A protected-build test cycle

  1. Prepare devices

    Set up clean physical devices plus prepared ones: rooted or jailbroken, with a debugger or hooking tool.

  2. Run functional suites

    Run your regression suite on the protected, signed build using the internal test profile.

  3. Exercise the controls

    Trigger each enabled control on prepared devices and confirm the response and the backend signal.

  4. Compare performance

    Measure the protected build against its baseline on the same devices and flows.

  5. Sign off the gate

    The release owner reviews all three layers and approves or stops the release.

Test the protected, signed build that users will install, in three layers, and let the combined result decide the release. Functional tests prove the app still works. Performance tests compare the protected build with its unprotected baseline on the same devices. Security-behaviour tests confirm that each enabled control responds as configured on prepared devices and that your backend receives the signal. Plan for one tension from the start: test automation looks like the tooling runtime protection watches for. Otukan supports this for Android and iOS apps, including Flutter and React Native, and each platform is tested on its own.

Test layers

Each layer answers a different question, and no layer can stand in for another.

LayerQuestion it answersTypical testsBuild under test
FunctionalDoes every feature still work?Regression suite, sign-in, payments, deep links, push, in-app purchaseProtected and signed, test profile
PerformanceIs the protected build acceptable to users?Start-up, flow latency, memory, crash and ANR or hang ratesBaseline and protected, same commit
Security behaviourDoes each control respond as configured?Prepared devices and tools, one control at a timeProtected and signed, release profile

Functional tests

Run the full regression suite against the protected artefact. Pay attention to features that rely on inspecting the app itself or its environment: third-party SDKs, WebViews, app extensions on iOS, and the Dart or JavaScript layer in Flutter and React Native apps. Hybrid apps are covered layer by layer on Ionic and Cordova app security.

Performance tests

Compare like with like: baseline and protected builds from one commit, signed the same way, on the same physical devices. The full method is on mobile app protection performance.

Security-behaviour tests

For each enabled control, write down the expected response per flow and the expected backend signal, then trigger it.

Condition to prepareExpected in the appExpected at the backend
Rooted Android device or jailbroken iPhoneThe response set for that flowA signal with the next sensitive request
Debugger attached to the appThe response set for that flowA signal with the next sensitive request
Hooking tool injectedThe response set for that flowA signal, and the server’s decision logged
App running in an emulator or simulatorThe response set for that flowA signal marking the environment
Copy re-signed with a different keyThe response set for that flowA signal identifying the modified copy

Android and iOS each get their own table, because the conditions and the tools used to create them differ.

Test environments

Automation and instrumentation

On Android, instrumented tests run inside the app’s process. On iOS, XCUITest drives the app from a separate runner process. Either way, the automation looks like outside control to a runtime check. Run most automated suites on internal builds with a test profile, and keep a smaller release-profile suite on clean devices.

Test-device exemptions

Exemptions let lab devices run automation without triggering responses. Keep them narrow and visible:

  • scope each exemption to internal test builds and to named lab devices
  • keep exemptions in the internal test profile only, never in the release profile
  • add a pipeline check that refuses a release build whose profile is not the approved one
  • review the exemption list when devices or team members change

Device sources

Physical devices you own give the cleanest results. Cloud device farms are useful for breadth, but some provide modified or instrumented devices, so confirm how their devices are set up before counting a result from them. Emulators and simulators suit functional checks only. Choosing test devices and setting release criteria are covered on security validation.

Release gates

Acceptance checklist

  • the build under test is the protected, signed artefact, with the approved release profile
  • the functional suite passed on every platform in the release
  • performance stays within the criteria your team set, per platform
  • each enabled control produced the expected response and backend signal
  • no test exemption is present in the release profile
  • results are stored with the build’s protection profile version and logs

Rollback

Stores do not let you replace a published binary. Halt the staged rollout on Google Play or pause the phased release on the App Store, then ship a corrected build with a higher version number.

Incident ownership

SituationFirst ownerOtukan’s role
A control blocks legitimate usersRelease owner, with securityReads the reports with you and adjusts the profile
Protected build crashes on some devicesMobile teamReproduces on matching devices with you
A signal is missing at the backendBackend teamChecks the signal path with your engineers

For how testing fits the release pipeline, return to mobile DevSecOps.

Common questions

  • Will our UI automation trip the runtime protection?

    It can, because instrumentation and automation drivers resemble the tools runtime protection is built to notice. Plan for it. Run most automated suites on internal builds with a test profile that exempts your lab devices, and run a smaller set on the release profile using clean devices. Otukan's engineers help you draw that line per platform.

  • Can a test exemption reach production?

    Not if the pipeline enforces it. Exemptions live in the internal test profile only, and every protected build records which profile it used. Add a release-gate check that refuses any build whose profile is not the approved release profile. That turns a human rule into a pipeline rule.

  • What if a control affects legitimate users after release?

    Halt or pause the staged rollout, then decide with your security owner whether the signal or the response is wrong. Where your design allows it, the response for that flow can move to observe from your server while a fixed build is prepared. Otukan's reports per app version show how many sessions were affected.

Related

Test the build your users install

Tell us your platforms, frameworks, the test automation you run and where your devices come from. Builds, keys and production data stay with you; we never request them.

Or request a technical demo