App testing and QA · UAE

App testing in Arabic and on real devices.

A build can pass a full cycle in English on a recent handset and fail its first Arabic customer. The defect this market produces is a locale defect, and it never reproduces in English.

Find out what the release is carrying

What app testing and QA is

What app testing and QA covers here.

Three things decide whether a pass means anything here. Only one of them is the device, and it is the one every quote already covers.

QA · test runDEVICE × LOCALEENARPixel 8Galaxy S23!Redmi 12iPhone 15!TEST RUNtests passed248/2524failing87%coverageEvery device, in both scripts, before your users are the test.

Tested in Arabic too.

An Arabic build is a layout condition rather than a translation. The same screen mirrors, and the same label runs half again as long, so the second script is an axis on the matrix instead of a checkbox at the end.

Every payment path tried.

The checkout has more than one instrument behind it, and a postcode does not locate an address here the way it does where the form was designed. A checkout test that passed on a card form has tested one path through a screen with several.

A pass or a fail.

A pass or a fail against a named standard, with reproducible steps. What is not fixed is stated rather than omitted, because a release decision made on a list of opinions is not a decision.

The scope

Six kinds of testing.

Six passes over the same build. Two of them find things the other four are structurally unable to see.

Functional testingvs spec47/48cases passededge cases included98% pass rateLogin & sign-upincl. wrong OTPpassCheckout · Apple Pay / CODincl. payment failpassOffline cartincl. reconnectpassCoupon on cart totalflaky · 1 retryflakyevery flow checked, edge cases and all

Functional, including the unhappy paths.

Every flow walked to its end, including the checkout with each instrument the market actually uses and the failure case behind each one

Output

a case list somebody can rerun rather than a session somebody remembers

FlowsFailure cases
Performance testingon mid-rangeRedmi Note 13 · 4G throttledMetricBudgetCold start2.0s1.4sMemory200 MB168 MBFrame rate60 fps58 fpsJank1%1.4%cold start, memory and battery on the phones users carry

Speed, measured on real devices.

Cold start, memory and the screens that stutter, recorded as numbers against a budget agreed beforehand

Output

a figure to argue with instead of an opinion about whether it feels slow

Cold startAgainst a budget
Security testingOWASP MASVS0critical findingsMASVS L1 + L2no way inData storageno secrets on diskCryptographyTLS 1.3 · pinnedAuthenticationtoken expiry · biometricNetworkno cleartext trafficCode & tamperobfuscated · root checkstorage, network and auth, no obvious way in

Security, against a named standard.

The OWASP mobile checklist worked through item by item, with each finding rated rather than listed

Output

a severity-ordered set you can decide about, and a written note of what was accepted

OWASPRated
Compatibilitydevice matrixold OScurrentsmallArabicGalaxy A15Xiaomi Redmi NoteOPPO Reno 11iPhone 12iPhone 15it works on their phone, not just ours

Compatibility, language included.

The matrix run across handsets and operating system versions, and then again in the other reading direction

Output

the grid where a locale defect becomes visible, because it has nowhere else to appear

Both scriptsReal handsets
Test automationevery buildAppium suite310 / 312passed · 2 skipped99.4%On every buildBuildTestReportrunning · 42sthe regression-prone flows, checked on every build

Automation for what keeps breaking.

The regression-prone paths scripted and run on every build, in your own pipeline rather than on our machine

Output

a suite that stays yours when the engagement ends

RegressionIn your pipeline
Manual & exploratoryreproducibleCart total wrong after couponHigh#BUG-2287 · CheckoutfiledSteps to reproduce1Add 3 items to cart2Apply coupon SAVE203Total shows pre-discountAED 68the weird bugs, found and filed with a repro

Hands-on testing for the odd ones.

A person using the app badly on purpose, then filing what broke with the steps, the device and the build number

Output

bugs a developer can reproduce on the first attempt

ExploratoryReproducible

A gate, or the reviews

Where a defect gets found.

Every build gets tested. The only question is whether it happens before the release or in the store listing afterwards.

Ship and find outFound in the reviewsA gate before releaseFound in the matrix
Who finds itA customer, in public, with a star rating attached to the discovery.A tester, on a Tuesday, with a build number and steps to reproduce.
The second scriptNever tested, because it looked fine in the screenshots somebody approved.An axis on the matrix, so a mirrored layout fault has somewhere to appear.
RegressionsFound by whoever happens to use that screen next, weeks later.Caught on the build that caused them, by a suite that runs unattended.
What you getA support queue, and a rating that takes months of good releases to move.A pass or a fail, and a written list of what is knowingly not fixed.
How much testing is enough.

Enough to make the release decision an informed one, which is less than a full regression on every build and a good deal more than opening the app once. The shape that works is a small automated suite on the flows that keep breaking, plus a human pass in both scripts before anything ships. Where nobody has touched the app in years the first question is a different one, answered on the maintenance page, and the device report this produces is also a build deliverable, covered on the Dubai page.

What we find in testing here

Why Arabic breaks apps that passed.

Webzenia has worked with Gulf clients since 2018. Four things that decide whether a pass is worth anything in this market.

  1. 01of 04
    The floor is newerStatcounter, August 2026

    Phones here are newer, so test the languages instead.

    Android is 77.53% of use and iOS 22.46%, and the two most recent Android releases carry roughly half of Android use while older ones still hold a real tail. That is a smaller compatibility bill than most matrices assume, and the room it frees is where the second script gets tested.

    Our methodThe matrix set from your own analytics, then extended by one axis for locale.
  2. 02of 04
    The locale defectInvisible in English

    Arabic layouts break in ways English never shows.

    A label that fits in English runs half again as long, a mirrored screen moves the back gesture, and an icon that meant forward now points away from it. A Business Bay proptech on a mainland DET licence whose Arabic came from a translation vendor has never had any of it opened by a tester.

    Our methodEvery case in the suite run in both reading directions, not a sample of them.
  3. 03of 04
    One screen, several pathsAnd one of them was tested

    A UAE checkout has several payment paths.

    A wallet, a card, an instalment plan and cash on delivery are four routes through one screen, each failing differently, and the address form is a fifth because a postcode does not locate a delivery point. An Al Quoz F&B group on a mainland DET licence found that in its store rating.

    Our methodEach instrument walked to completion and to failure, including the address form.
  4. 04of 04
    The declaration and the binaryThey drift apart quietly

    Test the build to see what it collects.

    A library added late brings its own defaults, and nobody updates the declaration. Apple has required a privacy manifest from newly added third-party SDKs since 1 May 2024, so the gate is whether the Tabby, Tamara or Network International wrapper declares itself. A Sharjah SAIF Zone manufacturer finds the gap at submission.

    Our methodThe library inventory taken from the shipped binary and compared with what is declared.

What the engagement covers

Inside the testing.

Six stages, and the first one is a conversation about risk rather than a list of screens. What can go wrong expensively decides what gets tested first.

Plan · coverageSTEP 01COVERAGE MATRIXUNITE2EMANUALAuthCheckoutProfileSearchWhat we test, and how deeply.

The risks and the phone list.

What fails expensively, on which handsets and in which scripts, from your own analytics rather than from a generic device list. The plan is what makes the coverage arguable rather than assumed.

  • Risks
  • Matrix
Cases · writtenSTEP 02TEST CASES48 casesTC-01Valid loginhomeTC-02Wrong passworderror shownTC-03Empty cartblockedTC-04Payment failsretrySteps and expected results, written down.

Test cases anyone can run.

Written so a person who has never seen the app can execute them and get the same answer. A case only its author can run is a memory rather than a test.

  • Written
  • Repeatable
Automate · CISTEP 03PIPELINEBuildTestLintShipRESULT142 passing· 0 failingThe suite runs on every commit.

Automating what keeps breaking.

The regression-prone flows scripted into your own pipeline, so they run on every build without anybody deciding to. Automating everything is a project; automating the fragile paths is a habit.

  • Regression
  • Every build
QA · both platformsSTEP 04DEVICE LABPixel 7Android 14iPhone 15iOS 18Galaxy A14Android 13iPad AiriPadOS 17CRASH-FREE · 7D99.6%sessions cleanTested across Android and iPhone.

Run on real phones, in both languages.

The matrix executed on physical devices and then executed again in the other reading direction, because a mirrored layout is a different render and not a different string.

  • Handsets
  • Both directions
Security · passSTEP 05SECURITY SCANNo criticalsFINDINGSCritical0High0Medium1 fixedLow3 fixedScanned for the OWASP top risks.

A security pass.

The OWASP mobile items worked through with each finding rated, plus the library inventory taken from the shipped binary and compared with what the listing declares.

  • OWASP
  • Inventory
Sign-off · release gateSTEP 06RELEASE GATETests142 passCoverage92%SecurityclearPerformancein budgetAPPROVEDPASScleared to shipGreen across the board, cleared to ship.

A pass or a fail, in writing.

One decision, with the severity list behind it and the accepted items written down. A report that ends in a bug count leaves the release decision to whoever is most tired.

  • Pass or fail
  • Accepted items

Our stack

The tools we test with.

One suite, a real device matrix, a way to break the network, a crash log and the repository it all lives in. Select one to see what it catches.

Appium
Why Appium

One suite that drives both platforms means a regression case is written once, and a locale run is the same suite with the device language changed rather than a second set of scripts.

How we excel

We parameterise the suite by locale as well as by device, so every automated case runs in both reading directions. A suite that only runs in English automates the half of the problem that was never failing.

One suite, both platformsRuns per localeCoverage
AppiumBoth
XCUITest and EspressoPer platform
A manual passOnce
Nothing automatedNone

How the work runs

From the risks to a signed release.

Testing is worth what the decision at the end of it is worth. The output is a release call, not a bug count.

01Week 1Scoped

Mapping the risks and the cases.

We establish what fails expensively, which handsets and operating system versions your own users are actually on, and which locales the product ships in. The cases are then written so somebody who has never seen the app can execute them. This week decides the coverage, and coverage decided by a device catalogue tests somebody else’s users thoroughly.

  • Matrixfrom your analytics
  • Localesan axis, not a checkbox
  • Casesrunnable by a stranger
02Weeks 2 to 4Built

Running it in both languages.

The suite runs on physical handsets and then again in the other reading direction, because a mirrored layout is a different render rather than a different string. Each payment instrument is walked to completion and to failure, the network is broken deliberately, and the regression-prone flows are automated into your own pipeline as they are found.

  • Directionsboth, every case
  • Payment pathssuccess and failure
  • Automationin your pipeline
03Every releaseRunning

A pass or a fail, recorded.

Each release gets a decision rather than a document: pass, or fail with the reason. What is knowingly not fixed is written down and accepted by somebody named, so a defect that ships is a choice rather than an oversight. Where the release rhythm is weekly this becomes a standing arrangement, which is a different commercial shape from a one-off pass and usually the right one.

  • Outputa decision, not a list
  • Acceptedwritten down and named
  • Cadencematched to your releases

Reported as a pass or a fail, so what is not fixed is a decision somebody made.

The gate, in writing
Both scriptsYour matrixYour suite

Our commitment

Four promises about the release.

Testing goes wrong when it produces a document instead of a decision. These four are written into the scope for that reason.

  • We test Arabic, or say we are not.

    Every case runs in both reading directions, or the engagement states plainly that the Arabic build was not covered. What we will not do is test around it and hand back a pass that means less than it appears to.

  • The phone list comes from your own analytics.

    Which handsets and operating system versions we run on is decided by what your users are actually holding. A standard device list is somebody else’s user base, tested carefully.

  • A pass or a fail, with gaps named.

    One decision, the severity list behind it, and the accepted items written down. A report that ends in a bug count hands the release call back to whoever is most tired at the end of the sprint.

  • The test suite is yours.

    Cases and automation live in your repository and run in your pipeline from the first week. A gate that only we can run is not a gate you own, whatever the retainer calls it.

Common questions

App testing, answered.

Next step

Get your release tested.

Send us the build and the two or three flows that matter most. We will come back with what fails, on the handsets this market carries and in both scripts.

Tell us what you need.

+971
Chat on WhatsApp