How to Write Test Cases for QR Code Scanning (With Examples)
How to Write Test Cases for Qr Code Scanning (With Examples) starts with understanding what the scanner must do and what can go wrong. A QR code scanner is expected to detect a matrix of black and whi
How to Write Test Cases for Qr Code Scanning (With Examples) starts with understanding what the scanner must do and what can go wrong. A QR code scanner is expected to detect a matrix of black and white modules, decode the embedded payload according to the ISO/IEC 18004 standard, and then act on that data—whether it opens a URL, displays text, triggers a payment, or adds a contact. Failures can arise from poor image quality, lighting, angle, contrast, damaged codes, non‑standard encoding, or malicious payloads. Writing effective test cases means covering the happy path, the ways the scanner can be fed bad data, and the rare conditions that only surface in the field. The guide below walks through the anatomy of a test case, provides a concrete matrix of more than twenty examples, shows how to prioritize and trace them to requirements, and explains how manual design combined with autonomous exploration yields real‑world coverage.
How to Write Test Cases for Qr Code Scanning (With Examples): Foundations
Before writing any test, clarify the functional and non‑functional requirements that govern the scanner. Functional requirements usually state:
- The scanner shall recognize QR codes of versions 1‑40 (21×21 to 177×177 modules).
- It shall decode numeric, alphanumeric, byte, and Kanji modes correctly.
- Upon successful decode, it shall invoke the configured handler (e.g., open a URL in the default browser).
- It shall reject codes that fail checksum validation.
Non‑functional requirements often cover:
- Minimum illumination of 50 lux for reliable detection.
- Maximum skew angle of ±30 degrees on any axis.
- Response time under 500 ms from frame capture to action.
- Accessibility: audible feedback for visually impaired users and sufficient contrast for low‑vision users.
With these requirements in hand, you can derive test conditions. Each test case should contain four essential parts:
- Identifier – a unique ID (e.g., TC_QR_001).
- Preconditions – device state, environment, and any test data needed.
- Steps – precise actions the tester or automation will perform.
- Expected Result – observable outcome that determines pass/fail.
Optional but useful fields include Postconditions (state after the test), Priority, Requirement ID, and Notes. Keeping the structure consistent makes reviews easier and enables traceability matrices later.
How to Write Test Cases for Qr Code Scanning (With Examples): Positive Cases
Positive test cases verify that the scanner works when presented with a well‑formed QR code under normal conditions. They form the baseline confidence that the core pipeline—image acquisition, preprocessing, detection, decoding, and post‑decode handling—functions correctly.
| ID | Preconditions | Steps | Expected Result |
|---|---|---|---|
| TC_QR_POS_001 | Device camera functional, ambient light ~200 lux, QR code printed at 30 mm × 30 mm, version 5, alphanumeric payload “HELLO123”. | 1. Launch scanner app. 2. Point camera at QR code, fill viewfinder. 3. Hold steady for 1 second. | Scanner decodes payload, displays “HELLO123” in a toast, and opens the default browser to https://example.com if payload is a URL. |
| TC_QR_POS_002 | Same as above, but payload is a vCard with name “Test User” and email “test@example.com”. | Same as TC_QR_POS_001. | Scanner recognizes vCard, shows contact preview, and offers “Add to Contacts”. |
| TC_QR_POS_003 | Device in portrait orientation, QR code version 10, byte mode encoding a JPEG thumbnail (base64). | 1. Launch scanner. 2. Scan code. 3. Observe result. | Decoded byte array is correctly re‑assembled into the JPEG and displayed in an image preview. |
| TC_QR_POS_004 | Device set to accessibility mode with TalkBack enabled, QR code version 7, numeric payload “9876543210”. | 1. Launch scanner. 2. Scan code. 3. Listen to audio feedback. | Scanner announces “Numeric code scanned: nine eight seven six five four three two one zero” and vibrates once. |
| TC_QR_POS_005 | Device battery >80 %, no other camera‑using apps running, QR code version 20, Kanji mode encoding “こんにちは”. | 1. Launch scanner. 2. Scan code. 3. Verify result. | Japanese text appears correctly in UTF‑8, and the app offers to copy to clipboard. |
| TC_QR_POS_006 | Device mounted on a tripod, QR code placed on a reflective surface, version 15, alphanumeric “REFLECT”. | 1. Launch scanner. 2. Scan code. 3. Observe. | Scanner handles specular reflection, decodes correctly, and shows payload. |
| TC_QR_POS_007 | Device in low‑light mode (night mode enabled), ambient light ~30 lux, QR code version 12, numeric “555”. | 1. Launch scanner. 2. Scan code. 3. Verify. | Scanner still decodes within 800 ms (night mode extends exposure) and shows payload. |
| TC_QR_POS_008 | Device with front‑facing camera, QR code version 6 printed on a t‑shirt, alphanumeric “WEAR”. | 1. Switch to front camera. 2. Scan code on clothing. 3. Verify. | Front camera successfully reads the code despite fabric texture. |
| TC_QR_POS_009 | Device with external USB‑C webcam attached, QR code version 8, byte mode payload a JSON string. | 1. Attach webcam. 2. Launch scanner with external source selected. 3. Scan. | Decoded JSON is parsed and displayed as formatted text. |
| TC_QR_POS_100 | Device in airplane mode (no network), QR code version 4, alphanumeric “OFFLINE”. | 1. Enable airplane mode. 2. Launch scanner. 3. Scan. | Scanner decodes and shows payload locally; no network call is attempted. |
These ten cases already cover a range of versions, data modes, orientations, lighting conditions, and hardware variations. You can extend the set by adding more versions (1‑40), mixing error correction levels (L, M, Q, H), and testing with codes that are deliberately rotated or skewed within the manufacturer’s specified limits.
How to Write Test Cases for Qr Code Scanning (With Examples): Negative and Invalid Input Test Cases
Negative test cases confirm that the scanner rejects malformed or non‑QR inputs and does not produce false positives. They also verify graceful error handling—showing a clear message rather than crashing or freezing.
| ID | Preconditions | Steps | Expected Result |
|---|---|---|---|
| TC_QR_NEG_001 | Device camera ready, no QR code in viewfinder (plain white paper). | 1. Launch scanner. 2. Point at blank paper. 3. Wait 2 seconds. | Scanner shows “No QR code detected” or similar prompt; no crash. |
| TC_QR_NEG_002 | Display a barcode (UPC‑A) on screen, not a QR code. | 1. Launch scanner. 2. Align camera with UPC barcode. 3. Hold. | Scanner does not decode; indicates invalid format. |
| TC_QR_NEG_003 | Show a QR code with deliberate damage: 30 % of modules covered by a black marker. | 1. Launch scanner. 2. Point at damaged code. 3. Wait. | Scanner either fails to detect or, if error correction permits, decodes correctly; in either case it does not corrupt data. |
| TC_QR_NEG_004 | Present a QR code whose format version indicator is inconsistent with the actual size (e.g., claims version 10 but drawn as version 5). | 1. Launch scanner. 2. Scan the mismatched code. 3. Observe. | Scanner rejects the code due to version/size mismatch and reports an error. |
| TC_QR_NEG_005 | Encode a payload longer than the maximum capacity for the chosen version and error correction level (e.g., 300 bytes in version 5‑L). | 1. Launch scanner. 2. Scan the oversized code. 3. Check result. | Scanner detects overflow during decoding and reports “Data too large for symbol”. |
| TC_QR_NEG_006 | Provide a QR code with an invalid mask pattern (mask pattern value outside 0‑7). | 1. Launch scanner. 2. Scan code. 3. Observe. | Scanner fails mask validation and discards the code. |
| TC_QR_NEG_007 | Show a QR code where the timing patterns are altered (extra black module in timing line). | 1. Launch scanner. 2. Scan. 3. Observe. | Detection fails due to pattern mismatch; no false decode. |
| TC_QR_NEG_008 | Present a QR code printed on a glossy surface that creates a specular hotspot covering the finder pattern. | 1. Launch scanner. 2. Attempt scan from angle that causes glare. 3. Observe. | Scanner either asks user to reduce glare or reports inability to locate finder pattern. |
| TC_QR_NEG_009 | Run scanner while another app holds the camera exclusively (e.g., active video call). | 1. Start video call in another app. 2. Launch scanner. 3. Try to scan. | Scanner reports “Camera unavailable” and does not crash. |
| TC_QR_NEG_010 | Feed the scanner a stream of random noise frames (e.g., from a disabled camera). | 1. Cover camera lens with opaque tape. 2. Launch scanner. 3. Observe output for 5 seconds. | Scanner continuously reports “No QR code detected” and stays responsive. |
These cases test the scanner’s ability to differentiate QR symbology from other visual patterns, to cope with physical damage, and to handle protocol violations. They also surface issues with resource contention and improper error messaging.
How to Write Test Cases for Qr Code Scanning (With Examples): Edge and Boundary Condition Test Cases
Edge cases push the scanner to the limits of the specification or the device’s hardware. Boundary conditions often reveal off‑by‑one errors in version detection, timing, or buffer handling.
| ID | Preconditions | Steps | Expected Result |
|---|---|---|---|
| TC_QR_EDG_001 | Device camera at minimum focus distance (macro mode), QR code version 1 (21×21) printed at 5 mm × 5 mm. | 1. Launch scanner. 2. Bring camera as close as possible. 3. Scan. | Scanner decodes the tiny code; if focus limits prevent, it reports “Image too blurry”. |
| TC_QR_EDG_002 | Device at maximum focus distance (infinity), QR code version 40 (177×177) printed at 200 mm × 200 mm, placed 2 meters away. | 1. Launch scanner. 2. Frame the large code. 3. Scan. | Scanner decodes the large code despite low pixel density per module. |
| TC_QR_EDG_003 | Ambient light at the lower bound of spec (50 lux). Use a light meter to confirm. QR code version 25, alphanumeric “LOWLIGHT”. | 1. Launch scanner. 2. Scan under 50 lux. 3. Observe. | Scanner succeeds within 1 second; if not, logs insufficient illumination. |
| TC_QR_EDG_004 | Ambient light at the upper bound (10 000 lux, direct sunlight). QR code version 20, numeric “BRIGHT”. | 1. Launch scanner outdoors. 2. Scan. 3. Observe. | Scanner avoids overexposure, either via auto‑EV compensation or by prompting user to shade the code. |
| TC_QR_EDG_005 | Device temperature at low end (0 °C) – place phone in a refrigerator for 10 minutes (no condensation). QR code version 10, byte mode. | 1. Launch scanner after acclimation. 2. Scan. 3. Verify. | Sensor performance unchanged; decode succeeds. |
| TC_QR_EDG_006 | Device temperature at high end (45 °C) – leave phone in a car on a hot day. QR code version 15, Kanji. | 1. Launch scanner after warm‑up. 2. Scan. 3. Verify. | No thermal throttling that causes frame drops; decode succeeds. |
| TC_QR_EDG_007 | Battery at 5 % (low power mode enabled). QR code version 12, alphanumeric “LOWBAT”. | 1. Enable low power mode. 2. Launch scanner. 3. Scan. | Scanner may reduce frame rate but still decodes within spec; logs power‑save notice. |
| TC_QR_EDG_008 | Device orientation locked to landscape, QR code printed in portrait orientation (requires 90° rotation). | 1. Lock orientation. 2. Launch scanner. 3. Present code. 4. Scan. | Scanner detects and rotates internally; decodes correctly. |
| TC_QR_EDG_009 | QR code with error correction level L (7 % recovery) and exactly 7 % of modules randomly obscured. | 1. Generate code with known obscured pattern. 2. Launch scanner. 3. Scan. | Decoder succeeds thanks to error correction; if more than 7 % obscured, it fails gracefully. |
| TC_QR_EDG_010 | QR code with error correction level H (30 % recovery) and 30 % of modules obscured in a burst error pattern. | 1. Generate burst‑error pattern. 2. Launch scanner. 3. Scan. | Decoder succeeds; validates high‑level recovery. |
| TC_QR_EDG_011 | QR code encoded in byte mode with UTF‑8 characters outside BMP (e.g., 𝔘+1F600 grinning face emoji). | 1. Launch scanner. 2. Scan emoji‑encoded code. 3. Observe. | Decoder returns correct Unicode surrogate pair; app displays emoji. |
| TC_QR_EDG_012 | QR code with a silent failure: the finder patterns are present but the alignment pattern is shifted by one module (off‑by‑one). | 1. Launch scanner. 2. Scan misaligned code. 3. Observe. | Decoder fails alignment check and reports “Invalid symbol”. |
| TC_QR_EDG_013 | Device with a faulty pixel column (e.g., permanent green line) crossing the QR code. | 1. Launch scanner. 2. Position code so line crosses a data region. 3. Scan. | Depending on error correction, either decodes correctly or reports unreadable; no crash. |
| TC_QR_EDG_014 | QR code printed on a non‑flat surface (cylinder radius 20 mm) causing geometric distortion. | 1. Launch scanner. 2. Wrap code around cylinder. 3. Scan. | Scanner’s perspective correction handles moderate curvature; decodes if distortion within tolerance. |
| TC_QR_EDG_015 | QR code displayed on a low‑refresh‑rate monochrome e‑ink screen (no backlight). | 1. Launch scanner. 2. Point at e‑ink. 3. Scan. | Scanner relies on ambient light; if contrast sufficient, decodes; otherwise prompts for better lighting. |
| TC_QR_EDG_016 | QR code with a custom quiet zone narrower than 4 modules (violates spec). | 1. Launch scanner. 2. Scan code with 2‑module quiet zone. 3. Observe. | Some implementations tolerate narrow quiet zones; others reject. Record actual behavior. |
| TC_QR_EDG_017 | QR code encoded with extended channel interpretation (ECI) assigning a non‑standard character set (e.g., Shift_JIS). | 1. Launch scanner. 2. Scan ECI‑marked code. 3. Verify output charset. | Decoder applies ECI and outputs correct byte sequence; if ECI unsupported, it may ignore or flag. |
| TC_QR_EDG_018 | QR code version 7 with mixed modes (numeric → alphanumeric → byte) within same symbol. | 1. Launch scanner. 2. Scan mixed‑mode code. 3. Verify each segment decoded correctly. | Decoder handles mode switches; output matches concatenated payload. |
| TC_QR_EDG_019 | Device with accessibility font size set to largest; scanner UI must remain usable. | 1. Set font size to largest. 2. Launch scanner. 3. Attempt scan. 4. Verify UI elements not clipped. | All buttons, labels, and feedback remain visible and operable. |
| TC_QR_EDG_020 | QR code that encodes a JavaScript URL (e.g., “javascript:alert(1)’). | 1. Launch scanner with URL handler that validates schemes. 2. Scan malicious code. 3. Observe. | Scanner blocks non‑http/https schemes, shows warning, does not execute script. |
These edge cases test the limits of the imaging pipeline, error correction, environmental tolerances, and security boundaries. Documenting the actual observed behavior (pass, fail with specific message, or crash) is crucial for regression tracking.
How to Write Test Cases for Qr Code Scanning (With Examples): Performance, Usability and Accessibility Considerations
Beyond functional correctness, a scanner must meet performance thresholds, be easy to use, and accommodate users with diverse abilities. Test cases in this category often require instrumentation (e.g., measuring frame‑to‑action latency) or subjective evaluation.
| ID | Preconditions | Steps | Expected Result |
|---|---|---|---|
| TC_QR_PERF_001 | Device in performance mode, no background CPU load, QR code version 20, alphanumeric “PERF”. | 1. Launch scanner. 2. Start high‑resolution timer before first frame. 3. Scan code. 4. Stop timer when action (e.g., URL launch) begins. | Total latency ≤ 500 ms on 90 % of runs. |
| TC_QR_PERF_002 | Same as above, but enable battery saver (reduces CPU frequency). | 1. Enable battery saver. 2. Repeat scan. 3. Measure latency. | Latency ≤ 800 ms (allowing for CPU throttling). |
| TC_QR_USAB_001 | User with average vision, device held at natural angle (~45° tilt). QR code version 10, numeric “USAB”. | 1. Launch scanner. 2. User attempts to scan without instruction. 3. Record number of attempts and time to success. | ≤ 2 attempts and ≤ 3 seconds to decode on first try for ≥ 80 % of users. |
| TC_QR_USAB_002 | User wearing glasses with strong prescription; scanner must accommodate focal shift. | 1. User wears glasses. 2. Launch scanner. 3. Scan code at normal distance. 4. Verify success. | Decode succeeds; no need to remove glasses. |
| TC_QR_ACCESS_001 | User with TalkBack enabled, QR code version 6, alphanumeric “ACC”. | 1. Enable TalkBack. 2. Launch scanner. 3. Scan code. 4. Listen to spoken feedback. | TalkBack announces result (payload) and provides hint for retry hint for next action (e.g., “Double tap to open link”). |
| TC_QR_ACCESS_002 | User with reduced motor control; scanner UI must have large hit targets. | 1. Switch to accessibility mode with larger touch targets. 2. Launch scanner. 3. Attempt to tap the “Scan” button with a stylus simulating tremor. 4. Observe. | Button remains tappable; missed taps do not exit scanner. |
| TC_QR_ACCESS_003 | User with color blindness (deuteranopia); ensure finder pattern remains distinguishable. | 1. Enable deuteranopia simulator. 2. Launch scanner. 3. Point at QR code with red finder pattern on green background. 4. Verify detection. | Scanner still locates finder pattern via luminance contrast, not hue reliance. |
| TC_QR_SEC_001 | QR code containing a SQL injection string (“' OR 1=1--”) intended for a backend that expects alphanumeric input. | 1. Launch scanner that passes payload to a login form. 2. Scan code. 3. Observe backend response. | Scanner does not alter payload; backend treats it as literal string, no injection occurs. |
| TC_QR_SEC_002 | QR code encoding a long data URI that could trigger a buffer overflow if copied naïvely. | 1. Launch scanner with a native component that copies payload into a fixed‑size buffer. 2. Scan code. 3. Monitor for crash. | No crash; either truncation with error or safe dynamic allocation. |
| TC_QR_SEC_003 | QR code that attempts to launch an intent with ACTION_VIEW and a custom scheme (“myapp://doevil”). | 1. Launch scanner with intent filter that only accepts http/https. 2. Scan code. 3. Observe. | Scanner rejects non‑allowed scheme, shows warning, does not launch activity. |
Performance tests often need a script to automate timing. Below is a short Python snippet using the time module and adb shell to launch an Android scanner app and measure latency:
import subprocess, time
def scan_latency(apk_path, package, activity):
# Install app if needed
subprocess.run(["adb", "install", "-r", apk_path], check=True)
# Clear logs
subprocess.run(["adb", "logcat", "-c"], check=True)
# Start activity
subprocess.run(["adb", "shell", "am", "start", "-n", f"{package}/{activity}"], check=True)
# Simulate presenting a QR code (here we assume a test image is pushed)
subprocess.run(["adb", "push", "test_qr.png", "/sdcard/Download/"], check=True)
# Use UI Automator to click scan button and capture timestamp
start = time.time()
subprocess.run([
"adb", "shell", "uiautomator", "runtest",
"ScanTest.jar", "-c", "com.example.scan.Test#measureLatency"
], check=True)
end = time.time()
print(f"Latency: {end-start:.3f}s")
return end-start
You can replace the UI Automator test with Espresso or a simple input tap sequence if your test device supports it. The key is to capture the moment the scanner begins processing a frame and the moment it triggers the post‑decode action.
How to Write Test Cases for Qr Code Scanning (With Examples): Prioritization, Traceability and Test Management
A large test suite benefits from clear prioritization and traceability to requirements. Assign each test case a priority level (P0‑P3) based on risk and impact, and link it to a requirement ID from your specification document.
| Priority | Definition | Example Use |
|---|---|---|
| P0 | Must‑pass for release; failure blocks shipment. | TC_QR_POS_001 (basic decode), TC_QR_NEG_001 (no false positive). |
| P1 | Important for core functionality; release may proceed with known issues if workaround exists. | TC_QR_POS_004 (accessibility feedback), TC_QR_PERF_001 (latency). |
| P2 | Useful for confidence; can be deferred to later sprint. | TC_QR_EDG_007 (low battery), TC_QR_USAB_002 (glasses). |
| P3 | Nice‑to‑have, exploratory, or low‑risk. | TC_QR_SEC_002 (buffer overflow guard), TC_QR_ACCESS_003 (color blindness sim). |
Traceability matrix (requirement → test cases) helps auditors see coverage. Below is a simplified excerpt:
| Requirement ID | Description | Linked Test Cases |
|---|---|---|
| REQ_QR_FUNC_01 | Recognize QR versions 1‑40 | TC_QR_POS_001‑TC_QR_POS_010, TC_QR_EDG_001‑TC_QR_EDG_002 |
| REQ_QR_FUNC_02 | Decode all four encoding modes | TC_QR_POS_003 (byte), TC_QR_POS_005 (Kanji), TC_QR_POS_001 (alphanumeric), TC_QR_POS_002 (numeric) |
| REQ_QR_FUNC_03 | Apply error correction per level | TC_QR_EDG_009‑TC_QR_EDG_010 |
| REQ_QR_PERF_01 | End‑to‑end latency ≤ 500 ms nominal | TC_QR_PERF_001‑TC_QR_PERF_002 |
| REQ_QR_ACC_01 | Provide audible feedback for visually impaired | TC_QR_ACCESS_001 |
| REQ_QR_SEC_01 | Reject non‑http/https URL schemes | TC_QR_SEC_003 |
When you add a new requirement, simply create test cases that map to it and update the matrix. This practice also supports impact analysis: if a requirement changes, you can quickly identify which test cases need revision.
How to Write Test Cases for Qr Code Scanning (With Examples): Combining Manual Test Cases with Autonomous Exploration
Manual test cases give you intentional, requirement‑driven coverage. Autonomous exploration tools complement them by exercising the scanner in ways that are hard to anticipate—different sequences of gestures, unexpected interruptions, or varied environmental noise. The combination yields a more robust confidence level.
One such autonomous QA platform is SUSA. After you install the agent (pip install susatest-agent) and point it at the APK or a web URL hosting the scanner, SUSA will:
- Launch the app and begin interacting with UI elements using a blend of curious, impatient, and power‑user personas.
- Attempt to scan QR codes under varying lighting, angles, and speeds, automatically generating dozens of permutations per minute.
- Detect crashes, ANRs, dead buttons (e.g., a scan button that becomes disabled after a certain sequence), and accessibility violations without any pre‑written test script.
- Record each explored screen and dead end, so subsequent runs become smarter, focusing on unexplored states.
- Export the discovered flows as regression scripts—Appium for Android native components and Playwright for web‑based scanners—allowing you to integrate them into your CI pipeline.
To get the most out of SUSA alongside your manual suite, follow this workflow:
- Baseline Run – Execute SUSA with default personas for 10 minutes on a clean device. Export the flow graph and note any newly discovered screens (e.g., a hidden settings pane that toggles torch).
- Gap Analysis – Compare the autonomous flow graph with your manual test case map. Identify requirements that lack coverage (perhaps a requirement about handling torch toggle while scanning).
- Manual Augmentation – Write one or two targeted test cases to cover the gaps (e.g., TC_QR_MAN_001: “Scan QR code while torch is on, then turn torch off mid‑scan”).
- Re‑run SUSA – Include the new test case as a seeded script so the agent can explore variations around it (different torch timings, combined with low battery).
- CI Integration – Schedule a nightly job that runs the exported Appium/Playwright scripts and fails the build if any regression appears.
An example of a seeded Appium test that SUSA might generate after discovering a torch‑toggle interaction:
public class TorchDuringScanTest {
private AndroidDriver<MobileElement> driver;
@Before
public void setUp() {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("appPackage", "com.example.scanner");
caps.setCapability("appActivity", ".MainActivity");
driver = new AndroidDriver<>(new URL("http://localhost:4723/wd/hub"), caps);
}
@Test
public void scanWithTorchToggle() {
// Assume the scanner UI has a torch button with ID "torch_btn"
MobileElement scanBtn = driver.findElementById("scan_btn");
MobileElement torchBtn = driver.findElementById("torch_btn");
scanBtn.click(); // start scanning
torchBtn.click(); // turn torch on
Thread.sleep(800); // let scanner adapt
torchBtn.click(); // turn torch off
// Wait for decode result or timeout
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("result_text")));
String result = driver.findElementById("result_text").getText();
Assert.assertEquals("EXPECTED_PAYLOAD", result);
}
}
By merging the deterministic rigor of your manual cases with the stochastic breadth of SUSA’s exploration, you achieve both requirement traceability and surprise‑defect detection—a combination that has proven effective in production‑grade QR scanning applications.
Checklist for Writing QR Code Scanner Test Cases
Before you consider your test suite complete, run through this concise checklist. Each item can be ticked off after you have evidence (test case, automation log, or exploration report) that satisfies it.
- [ ] Requirement Mapping – Every functional and non‑functional requirement has at least one P0 or P1 test case linked.
- [ ] Positive Coverage – All versions (1‑40), all data modes (numeric, alphanumeric, byte, Kanji), and all error correction levels (L, M, Q, H) appear in at least one
Test Your App Autonomously
Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.
Try SUSA Free