Drop a 600 KB server into your Qt 5 or Qt 6 app. Drive it from Python, C++, or .NET with 42 commands over an open TCP protocol. Sub-millisecond. Headless-CI friendly. No vendor lock-in. Professional needs no license server; Enterprise floating uses a self-hosted one inside your network.
One command downloads a self-contained demo app (no Qt install needed), drives it live from Python, and leaves a screenshot on your disk. Linux x86_64 - other platforms start at installation.
curl -sL https://dl.vericue.dev/try.sh | bash
Already have a Qt app? Evaluate against your own unmodified binary - no build changes:
vericue-inject --port 4242 -- ./your-qt-app
how it works →
Six things that decide whether a test framework actually works in production.
Length-prefixed JSON over TCP. No browser engines, no DOM inspectors, no 30-second startup. Commands land in microseconds.
Auto-detects QWidget windows and QQuickWindows. Same 42 commands work against both - including model/view data, touch, and gestures.
Capture per-widget screenshots, diff against a baseline with configurable tolerance. Fails the CI when a button moves 3 pixels - not when it's noise.
Python (asyncio), C++ (Qt signals/slots), and .NET 8 (TAP). One protocol, three identical surfaces. Use whichever your team already knows.
Runs under QT_QPA_PLATFORM=offscreen. JUnit XML + HTML reports. Drop into Jenkins, GitHub Actions, GitLab CI - no display server required.
Documented JSON-over-TCP. Write a client in any language. Your test infrastructure stays yours - no Tcl, no proprietary scripting language, no lock-in.
An honest take. Every team we talk to has tried at least one of these. Here's where they hit the wall.
QT_QPA_PLATFORM=offscreenSame protocol surface across SDKs. Pick the language that matches your CI and your developers' muscle memory.
MultiVeriCueClientfrom vericue import VeriCueClient async with VeriCueClient() as c: await c.connect("127.0.0.1", 4242) # Inspect btn = await c.find_object(path="MainWindow/okBtn") assert btn["className"] == "QPushButton" # Drive await c.mouse_click("MainWindow/okBtn") # Subscribe to a signal - push events sub = await c.subscribe_signal( "MainWindow/uploader", "finished", ) event = await c.next_event(timeout=10)
#include <vericue/gtest_fixture.h> class LoginTest : public vericue::VeriCueTest {}; TEST_F(LoginTest, OkButtonClicks) { auto r = invoke("mouse_click", QJsonObject{ {"path", "MainWindow/okBtn"}, }); EXPECT_TRUE(r["clicked"].toBool()); EXPECT_EQ( prop("MainWindow/statusLabel", "text"), "Logged in" ); }
using veriCue; await using var client = new VeriCueClient(); await client.ConnectAsync("127.0.0.1", 4242); await client.TypeTextAsync("LoginWindow/user", "alice"); await client.MouseClickAsync("LoginWindow/loginBtn"); var props = await client.GetPropertiesAsync( "MainWindow/statusLabel", new[] { "text" } ); Assert.Equal("Logged in", props.GetProperty("text").GetString());
Your Qt application embeds a small server. Your test code talks to it over TCP. That's it.
setLicenseFile()start(4242)Request a 30-day trial licence. We respond within one business day with your signed key and a download link.
Talk to us about a trialWe respond within one business day with a 30-day trial licence and a Quick Start tailored to your application. Pricing is public and transparent - from EUR 299 net/quarter, listed on the pricing page.