Running Windows desktop tests from Linux with disposable VMs
🇬🇧 English
Testing Windows desktop apps has long been one of the most requested features from customers, because no one had infrastructure to run thousands of these tests in parallel each month. Web testing is comparatively easy: a headless browser starts in a Linux container in seconds, costs a fraction of a cent, and is discarded when the test ends. Windows desktop testing has no equivalent. Every test needs a full virtual machine, since Windows containers lack a graphical desktop. A cold Windows VM takes 2 to 3 minutes to boot, and someone must be logged in, because Windows UI Automation only works inside an active desktop session. Machines also retain installed files, registry keys, user profiles and saved logins between runs, while each app brings its own installers, admin prompts and first-run dialogs. Remote Windows machines offer no built-in traces, logs or screenshots, and most test infrastructure was designed around Linux.
The team's answer was to treat Windows machines like phones: a device that one test claims, uses once, and throws away. The architecture borrows from its mobile testing infrastructure. A custom device scheduler in Kubernetes hands out a Windows VM on Google Compute Engine through a Device Claim, and the test controls it remotely with WebdriverIO and Appium. Two extensions to the device model were needed: devices can live outside the cluster, and claims can return desktop connection addresses, including CDP for browsers.
The system has three parts: a controller that maintains a warm pool of Windows VMs, a Linux runner pod that executes the test code, and the Windows VM itself, which runs the app under test and a small desktop agent. The runner connects over Playwright's CDP for browser content, Appium for native apps, and a WebRTC stream that lets people watch tests live and review recordings afterward.
Each VM is disposable. Nobody logs in, patches it or keeps it running for weeks, and a fresh machine replaces each one after use.
🇸🇦 العربية
E2exe: حل أتمتة سطح مكتب Windows على نطاق واسع
ظل اختبار تطبيقات سطح مكتب Windows من أكثر الميزات التي يطلبها العملاء منذ زمن طويل، لأنه لم يكن لدى أحد البنية التحتية اللازمة لتشغيل آلاف هذه الاختبارات بالتوازي كل شهر. اختبار الويب أسهل نسبيًا: يبدأ متصفح بلا واجهة رسومية داخل حاوية Linux في ثوانٍ، وتكلف جزءًا ضئيلًا من السنت، ويُتخلص منه عند انتهاء الاختبار. أما اختبار سطح مكتب Windows فليس له مقابل. يحتاج كل اختبار إلى جهاز افتراضي كامل، لأن حاويات Windows لا تتضمن سطح مكتب رسومي. يستغرق تشغيل جهاز Windows افتراضي من الصفر من دقيقتين إلى ثلاث دقائق، ويجب أن يكون هناك مستخدم مسجل الدخول، لأن أتمتة واجهة Windows لا تعمل إلا داخل جلسة سطح مكتب نشطة. كما تحتفظ الأجهزة بالملفات المثبتة ومفاتيح السجل وملفات تعريف المستخدمين وبيانات الدخول المحفوظة بين عمليات التشغيل، بينما تأتي كل تطبيق بمثبتاته الخاصة وطلبات المسؤول ونوافذ التشغيل الأول. كما أن أجهزة Windows البعيدة لا توفر تتبعات أو سجلات أو لقطات شاشة مدمجة، ومعظم البنية التحتية للاختبار صُممت حول Linux.
كان رد الفريق معاملة أجهزة Windows كالهواتف: جهاز يحجزه اختبار واحد، ويستخدمه مرة واحدة، ثم يتخلص منه. تستعير البنية من بنيتها التحتية لاختبار الأجهزة المحمولة. يخصص مجدول أجهزة مخصص في Kubernetes جهاز Windows افتراضيًا على Google Compute Engine عبر مطالبة بالجهاز (Device Claim)، ويتحكم فيه الاختبار عن بُعد باستخدام WebdriverIO وAppium. احتاج نموذج الجهاز إلى توسعتين: يمكن أن تعمل الأجهزة خارج الكتلة، ويمكن أن تُعيد المطالبات عناوين اتصال بسطح المكتب، بما في ذلك CDP للمتصفحات.
يتكون النظام من ثلاثة أجزاء: وحدة تحكم تحافظ على مجموعة مُسخّنة من أجهزة Windows الافتراضية، وحاوية (Pod) Linux للمشغّل تنفذ كود الاختبار، وجهاز Windows الافتراضي نفسه الذي يشغل التطبيق قيد الاختبار ووكيل سطح مكتب صغيرًا. يتصل المشغّل عبر CDP في Playwright لمحتوى المتصفح، وعبر Appium للتطبيقات الأصلية، وعبر بث WebRTC يتيح للناس مشاهدة الاختبارات مباشرة ومراجعة التسجيلات لاحقًا.
كل جهاز افتراضي قابل للتخلص منه. لا أحد يسجل الدخول إليه أو يحدّثه أو يبقيه قيد التشغيل لأسابيع، ويحل محل كل جهاز بعد استخدامه جهاز جديد.
لماذا لا يمكن اختبار تطبيقات سطح مكتب Windows داخل حاويات مثل تطبيقات الويب؟
لا تتضمن حاويات Windows سطح مكتب رسومي، ولا تعمل أتمتة واجهة Windows إلا داخل جلسة سطح مكتب نشطة ومسجل فيها الدخول. لذلك يحتاج كل اختبار إلى جهاز افتراضي كامل، وهو أبطأ في البدء من حاوية المتصفح بلا واجهة رسومية.
🇧🇩 বাংলা
E2exe: বড় পরিসরে Windows ডেস্কটপ অটোমেশনের সমাধান
Windows ডেস্কটপ অ্যাপ পরীক্ষা করা দীর্ঘদিন ধরে গ্রাহকদের সবচেয়ে বেশি অনুরোধ করা বৈশিষ্ট্যগুলোর একটি, কারণ প্রতি মাসে এমন হাজার হাজার পরীক্ষা একসঙ্গে চালানোর অবকাঠামো কারও ছিল না। ওয়েব পরীক্ষা তুলনামূলকভাবে সহজ: একটি হেডলেস ব্রাউজার সেকেন্ডের মধ্যে একটি Linux কনটেইনারে চালু হয়, খরচ এক সেন্টের একটি ভগ্নাংশ, এবং পরীক্ষা শেষ হলে সেটি ফেলে দেওয়া হয়। Windows ডেস্কটপ পরীক্ষার কোনো সমতুল্য নেই। প্রতিটি পরীক্ষার জন্য একটি সম্পূর্ণ ভার্চুয়াল মেশিন প্রয়োজন, কারণ Windows কনটেইনারে গ্রাফিক্যাল ডেস্কটপ থাকে না। একটি ঠান্ডা Windows VM বুট হতে ২ থেকে ৩ মিনিট সময় নেয়, এবং কাউকে লগইন করা থাকতে হয়, কারণ Windows UI Automation কেবল একটি সক্রিয় ডেস্কটপ সেশনের ভেতরেই কাজ করে। মেশিনগুলো প্রতিটি রানের মধ্যে ইনস্টল করা ফাইল, রেজিস্ট্রি কী, ব্যবহারকারীর প্রোফাইল এবং সংরক্ষিত লগইনও ধরে রাখে, যেখানে প্রতিটি অ্যাপ নিজের ইনস্টলার, অ্যাডমিন প্রম্পট ও প্রথমবার চালানোর ডায়ালগ নিয়ে আসে। দূরবর্তী Windows মেশিনে কোনো অন্তর্নির্মিত ট্রেস, লগ বা স্ক্রিনশট থাকে না, এবং বেশিরভাগ পরীক্ষা অবকাঠামো Linux-কে কেন্দ্র করে তৈরি হয়েছিল।
দলের সমাধান ছিল Windows মেশিনগুলোকে ফোনের মতো বিবেচনা করা: একটি ডিভাইস যা একটি পরীক্ষা দখল করে, একবার ব্যবহার করে, তারপর ফেলে দেয়। এই স্থাপত্যটি তাদের মোবাইল পরীক্ষা অবকাঠামো থেকে ধার নেওয়া। Kubernetes-এর একটি কাস্টম ডিভাইস শিডিউলার একটি ডিভাইস ক্লেইমের (Device Claim) মাধ্যমে Google Compute Engine-এ একটি Windows VM বরাদ্দ করে, এবং পরীক্ষা WebdriverIO ও Appium দিয়ে এটি দূর থেকে নিয়ন্ত্রণ করে। ডিভাইস মডেলে দুটি সম্প্রসারণ প্রয়োজন হয়েছিল: ডিভাইস ক্লাস্টারের বাইরে থাকতে পারে, এবং ক্লেইম ব্রাউজারের জন্য CDP সহ ডেস্কটপ সংযোগের ঠিকানা ফেরত দিতে পারে।
সিস্টেমটির তিনটি অংশ রয়েছে: Windows VM-এর একটি প্রিওয়ার্মড পুল বজায় রাখা একটি কন্ট্রোলার, পরীক্ষার কোড চালানো একটি Linux রানার পড, এবং পরীক্ষাধীন অ্যাপ ও একটি ছোট ডেস্কটপ এজেন্ট চালানো Windows VM নিজে। রানার ব্রাউজারের কনটেন্টের জন্য Playwright-এর CDP, নেটিভ অ্যাপের জন্য Appium, এবং একটি WebRTC স্ট্রিমের মাধ্যমে সংযুক্ত হয়, যা মানুষকে পরীক্ষা সরাসরি দেখতে এবং পরে রেকর্ডিং পর্যালোচনা করতে দেয়।
প্রতিটি VM ব্যবহার-শেষে ফেলে দেওয়ার মতো। কেউ এতে লগইন করে না, প্যাচ করে না, বা সপ্তাহের পর সপ্তাহ চালু রাখে না, এবং ব্যবহারের পর প্রতিটির জায়গায় একটি নতুন মেশিন বসানো হয়।
ওয়েব অ্যাপের মতো কনটেইনারে Windows ডেস্কটপ অ্যাপ কেন পরীক্ষা করা যায় না?
Windows কনটেইনারে গ্রাফিক্যাল ডেস্কটপ থাকে না, এবং Windows UI Automation কেবল একটি সক্রিয়, লগইন করা ডেস্কটপ সেশনের ভেতরে কাজ করে। তাই প্রতিটি পরীক্ষার জন্য একটি সম্পূর্ণ ভার্চুয়াল মেশিন প্রয়োজন, যা হেডলেস ব্রাউজার কনটেইনারের চেয়ে চালু হতে বেশি সময় নেয়।
🇩🇪 Deutsch
E2exe: Automatisierung von Windows-Desktop-Tests im großen Maßstab
Das Testen von Windows-Desktop-Anwendungen gehörte lange zu den am häufigsten gewünschten Funktionen unserer Kunden, weil niemand die Infrastruktur hatte, Tausende dieser Tests jeden Monat parallel auszuführen. Webtests sind vergleichsweise einfach: Ein Headless-Browser startet in Sekunden in einem Linux-Container, kostet einen Bruchteil eines Cents und wird nach Testende verworfen. Für Windows-Desktop-Tests gibt es kein Äquivalent. Jeder Test benötigt eine vollständige virtuelle Maschine, da Windows-Container keine grafische Desktopoberfläche bieten. Eine kalt gestartete Windows-VM braucht 2 bis 3 Minuten zum Booten, und es muss jemand angemeldet sein, denn die Windows UI Automation funktioniert nur innerhalb einer aktiven Desktopsitzung. Die Maschinen behalten außerdem installierte Dateien, Registry-Schlüssel, Benutzerprofile und gespeicherte Anmeldedaten zwischen den Durchläufen bei, während jede Anwendung eigene Installationsprogramme, Administratorabfragen und Dialoge beim ersten Start mitbringt. Entfernte Windows-Maschinen bieten keine eingebauten Traces, Logs oder Screenshots, und der Großteil der Testinfrastruktur war um Linux herum entworfen worden.
Die Antwort des Teams bestand darin, Windows-Maschinen wie Telefone zu behandeln: ein Gerät, das ein Test belegt, einmal verwendet und dann wegwirft. Die Architektur übernimmt Ideen aus der mobilen Testinfrastruktur des Unternehmens. Ein eigener Gerätescheduler in Kubernetes vergibt über einen Gerätanspruch (Device Claim) eine Windows-VM auf Google Compute Engine, und der Test steuert sie per WebdriverIO und Appium aus der Ferne. Am Gerätemodell waren zwei Erweiterungen nötig: Geräte können außerhalb des Clusters liegen, und Ansprüche können Desktop-Verbindungsadressen zurückgeben, einschließlich CDP für Browser.
Das System besteht aus drei Teilen: einem Controller, der einen vorgewärmten Pool von Windows-VMs unterhält, einem Linux-Runner-Pod, der den Testcode ausführt, und der Windows-VM selbst, auf der die getestete Anwendung und ein kleiner Desktop-Agent laufen. Der Runner verbindet sich über das CDP von Playwright für Browserinhalte, über Appium für native Anwendungen und über einen WebRTC-Stream, mit dem Personen Tests live verfolgen und Aufzeichnungen anschließend prüfen können.
Jede VM ist ein Einwegobjekt. Niemand meldet sich an, spielt Patches ein oder lässt sie wochenlang laufen; nach der Nutzung ersetzt eine frische Maschine die alte.
Warum lassen sich Windows-Desktop-Anwendungen nicht wie Webanwendungen in Containern testen?
Windows-Container enthalten keine grafische Desktopoberfläche, und die Windows UI Automation funktioniert nur innerhalb einer aktiven, angemeldeten Desktopsitzung. Daher benötigt jeder Test eine vollständige virtuelle Maschine, die deutlich langsamer startet als ein Headless-Browser-Container.
🇪🇸 Español
E2exe: resolviendo la automatización de escritorio de Windows a escala
Probar aplicaciones de escritorio de Windows ha sido durante mucho tiempo una de las funciones más solicitadas por los clientes, porque nadie tenía la infraestructura para ejecutar miles de estas pruebas en paralelo cada mes. Las pruebas web son comparativamente sencillas: un navegador sin interfaz se inicia en un contenedor Linux en segundos, cuesta una fracción de centavo y se descarta cuando termina la prueba. Las pruebas de escritorio de Windows no tienen un equivalente. Cada prueba necesita una máquina virtual completa, ya que los contenedores de Windows carecen de un escritorio gráfico. Una máquina virtual de Windows en frío tarda de 2 a 3 minutos en arrancar, y alguien debe haber iniciado sesión, porque la automatización de la interfaz de Windows solo funciona dentro de una sesión de escritorio activa. Además, las máquinas conservan entre ejecuciones los archivos instalados, las claves del registro, los perfiles de usuario y los inicios de sesión guardados, mientras que cada aplicación trae sus propios instaladores, solicitudes de administrador y diálogos de primer uso. Las máquinas Windows remotas no ofrecen trazas, registros ni capturas de pantalla integrados, y la mayoría de la infraestructura de pruebas se diseñó en torno a Linux.
La respuesta del equipo fue tratar las máquinas Windows como teléfonos: un dispositivo que una prueba reserva, usa una vez y desecha. La arquitectura toma prestado de su infraestructura de pruebas móviles. Un planificador de dispositivos personalizado en Kubernetes asigna una máquina virtual Windows en Google Compute Engine mediante una reclamación de dispositivo (Device Claim), y la prueba la controla de forma remota con WebdriverIO y Appium. Se necesitaron dos extensiones del modelo de dispositivos: los dispositivos pueden estar fuera del clúster, y las reclamaciones pueden devolver direcciones de conexión de escritorio, incluido CDP para navegadores.
El sistema tiene tres partes: un controlador que mantiene un grupo precalentado de máquinas virtuales Windows, un pod de ejecución Linux que ejecuta el código de prueba, y la propia máquina virtual Windows, que ejecuta la aplicación bajo prueba y un pequeño agente de escritorio. El ejecutor se conecta mediante CDP de Playwright para el contenido del navegador, Appium para las aplicaciones nativas y un flujo WebRTC que permite ver las pruebas en vivo y revisar las grabaciones después.
Cada máquina virtual es desechable. Nadie inicia sesión en ella, la parchea ni la mantiene en funcionamiento durante semanas, y tras su uso la reemplaza una máquina nueva.
¿Por qué las aplicaciones de escritorio de Windows no pueden probarse en contenedores como las aplicaciones web?
Los contenedores de Windows no incluyen un escritorio gráfico, y la automatización de la interfaz de Windows solo funciona dentro de una sesión de escritorio activa y con sesión iniciada. Por eso cada prueba necesita una máquina virtual completa, que tarda más en arrancar que un contenedor con navegador sin interfaz.
🇫🇷 Français
E2exe : résoudre l'automatisation des bureaux Windows à grande échelle
Tester les applications de bureau Windows est depuis longtemps l'une des fonctionnalités les plus demandées par les clients, car personne ne disposait de l'infrastructure nécessaire pour exécuter chaque mois des milliers de ces tests en parallèle. Les tests web sont relativement simples : un navigateur sans interface démarre en quelques secondes dans un conteneur Linux, coûte une fraction de centime et est supprimé à la fin du test. Pour les tests de bureau Windows, il n'existe aucun équivalent. Chaque test nécessite une machine virtuelle complète, car les conteneurs Windows ne disposent pas d'un bureau graphique. Une machine virtuelle Windows démarrée à froid met 2 à 3 minutes à s'initialiser, et quelqu'un doit être connecté, car l'automatisation de l'interface Windows ne fonctionne que dans une session de bureau active. Les machines conservent aussi entre deux exécutions les fichiers installés, les clés de registre, les profils utilisateur et les identifiants enregistrés, tandis que chaque application apporte ses propres programmes d'installation, invites d'administrateur et boîtes de dialogue de premier lancement. Les machines Windows distantes n'offrent pas de traces, de journaux ni de captures d'écran intégrés, et la plupart des infrastructures de test ont été conçues autour de Linux.
La réponse de l'équipe a été de traiter les machines Windows comme des téléphones : un appareil qu'un test réserve, utilise une fois, puis jette. L'architecture s'inspire de son infrastructure de test mobile. Un planificateur d'appareils personnalisé dans Kubernetes attribue une machine virtuelle Windows sur Google Compute Engine via une réservation d'appareil (Device Claim), et le test la contrôle à distance avec WebdriverIO et Appium. Deux extensions du modèle d'appareil ont été nécessaires : les appareils peuvent se trouver en dehors du cluster, et les réservations peuvent renvoyer des adresses de connexion au bureau, y compris le CDP pour les navigateurs.
Le système comprend trois éléments : un contrôleur qui maintient un pool préchauffé de machines virtuelles Windows, un pod d'exécution Linux qui exécute le code de test, et la machine virtuelle Windows elle-même, qui exécute l'application testée et un petit agent de bureau. Le runner se connecte via le CDP de Playwright pour le contenu des navigateurs, via Appium pour les applications natives, et via un flux WebRTC qui permet de suivre les tests en direct et de consulter les enregistrements ensuite.
Chaque machine virtuelle est jetable. Personne ne s'y connecte, ne la met à jour ni ne la laisse tourner pendant des semaines, et une machine neuve remplace chacune après usage.
Pourquoi les applications de bureau Windows ne peuvent-elles pas être testées dans des conteneurs comme les applications web ?
Les conteneurs Windows n'incluent pas de bureau graphique, et l'automatisation de l'interface Windows ne fonctionne que dans une session de bureau active avec un utilisateur connecté. Chaque test nécessite donc une machine virtuelle complète, plus lente à démarrer qu'un conteneur de navigateur sans interface.
🇮🇳 हिन्दी
E2exe: बड़े पैमाने पर Windows डेस्कटॉप ऑटोमेशन की समस्या का समाधान
Windows डेस्कटॉप ऐप्स का परीक्षण लंबे समय से ग्राहकों की सबसे अधिक माँगी जाने वाली सुविधाओं में से एक रहा है, क्योंकि किसी के पास हर महीने ऐसे हज़ारों परीक्षणों को समानांतर रूप से चलाने का बुनियादी ढाँचा नहीं था। वेब परीक्षण अपेक्षाकृत आसान है: एक हेडलेस ब्राउज़र Linux कंटेनर में सेकंडों में शुरू हो जाता है, उसकी लागत एक सेंट के एक अंश जितनी होती है, और परीक्षण समाप्त होने पर उसे हटा दिया जाता है। Windows डेस्कटॉप परीक्षण के लिए इसका कोई समकक्ष नहीं है। हर परीक्षण को एक पूरी वर्चुअल मशीन की ज़रूरत होती है, क्योंकि Windows कंटेनरों में ग्राफ़िकल डेस्कटॉप नहीं होता। एक ठंडी Windows VM को बूट होने में 2 से 3 मिनट लगते हैं, और किसी को लॉग इन होना ज़रूरी है, क्योंकि Windows UI Automation केवल एक सक्रिय डेस्कटॉप सत्र के भीतर काम करता है। मशीनें हर रन के बीच इंस्टॉल की गई फ़ाइलें, रजिस्ट्री कुंजियाँ, उपयोगकर्ता प्रोफ़ाइल और सहेजे गए लॉगिन भी बनाए रखती हैं, जबकि हर ऐप अपने इंस्टॉलर, एडमिन प्रॉम्प्ट और पहली बार चलने वाले संवाद साथ लाता है। दूरस्थ Windows मशीनें अंतर्निहित ट्रेस, लॉग या स्क्रीनशॉट नहीं देतीं, और अधिकांश परीक्षण बुनियादी ढाँचा Linux के आसपास डिज़ाइन किया गया था।
टीम का समाधान था Windows मशीनों को फ़ोन की तरह मानना: एक ऐसा डिवाइस जिसे एक परीक्षण लेता है, एक बार इस्तेमाल करता है और फिर फेंक देता है। यह आर्किटेक्चर अपने मोबाइल परीक्षण बुनियादी ढाँचे से प्रेरित है। Kubernetes में एक कस्टम डिवाइस शेड्यूलर Google Compute Engine पर एक Windows VM को डिवाइस क्लेम (Device Claim) के माध्यम से सौंपता है, और परीक्षण WebdriverIO और Appium के ज़रिए उसे दूर से नियंत्रित करता है। डिवाइस मॉडल में दो विस्तार करने पड़े: डिवाइस क्लस्टर के बाहर रह सकते हैं, और क्लेम डेस्कटॉप कनेक्शन पते लौटा सकते हैं, जिनमें ब्राउज़रों के लिए CDP भी शामिल है।
यह प्रणाली तीन भागों से बनी है: एक कंट्रोलर जो Windows VM का गर्म पूल बनाए रखता है, एक Linux रनर पॉड जो परीक्षण कोड चलाता है, और स्वयं Windows VM, जो परीक्षण किए जा रहे ऐप और एक छोटे डेस्कटॉप एजेंट को चलाती है। रनर ब्राउज़र सामग्री के लिए Playwright के CDP, नेटिव ऐप्स के लिए Appium, और एक WebRTC स्ट्रीम से जुड़ता है, जो लोगों को परीक्षण लाइव देखने और बाद में रिकॉर्डिंग की समीक्षा करने देती है।
हर VM एकल-उपयोग है। कोई उसमें लॉग इन नहीं करता, उसे पैच नहीं करता या हफ़्तों तक चालू नहीं रखता, और हर उपयोग के बाद उसकी जगह एक नई मशीन लाई जाती है।
Windows डेस्कटॉप ऐप्स को वेब ऐप्स की तरह कंटेनरों में क्यों नहीं परखा जा सकता?
Windows कंटेनरों में ग्राफ़िकल डेस्कटॉप शामिल नहीं होता, और Windows UI Automation केवल सक्रिय, लॉग-इन डेस्कटॉप सत्र के भीतर काम करता है। इसलिए हर परीक्षण को एक पूरी वर्चुअल मशीन चाहिए, जो हेडलेस ब्राउज़र कंटेनर से शुरू होने में धीमी होती है।
🇮🇩 Bahasa Indonesia
E2exe: Mengatasi Otomatisasi Desktop Windows dalam Skala Besar
Pengujian aplikasi desktop Windows sejak lama menjadi salah satu fitur yang paling banyak diminta pelanggan, karena tidak ada yang memiliki infrastruktur untuk menjalankan ribuan pengujian ini secara paralel setiap bulan. Pengujian web relatif mudah: browser headless dimulai dalam kontainer Linux hanya dalam hitungan detik, biayanya hanya sebagian kecil dari satu sen, dan dibuang begitu pengujian selesai. Pengujian desktop Windows tidak memiliki padanan seperti itu. Setiap pengujian memerlukan mesin virtual penuh, karena kontainer Windows tidak menyertakan desktop grafis. Mesin virtual Windows yang dinyalakan dari kondisi dingin membutuhkan 2 hingga 3 menit untuk booting, dan seseorang harus sudah masuk, karena Windows UI Automation hanya berfungsi di dalam sesi desktop yang aktif. Mesin juga mempertahankan berkas terpasang, kunci registri, profil pengguna, dan login tersimpan di antara setiap eksekusi, sementara setiap aplikasi membawa penginstal, permintaan admin, dan dialog saat pertama kali dijalankan sendiri. Mesin Windows jarak jauh tidak menyediakan jejak, log, atau tangkapan layar bawaan, dan sebagian besar infrastruktur pengujian dirancang dengan Linux sebagai basisnya.
Jawaban tim adalah memperlakukan mesin Windows seperti ponsel: perangkat yang diklaim satu pengujian, dipakai sekali, lalu dibuang. Arsitekturnya meminjam dari infrastruktur pengujian seluler mereka. Sebuah penjadwal perangkat kustom di Kubernetes menyerahkan mesin virtual Windows di Google Compute Engine melalui Device Claim, dan pengujian mengendalikannya dari jarak jauh dengan WebdriverIO dan Appium. Model perangkat perlu dua perluasan: perangkat dapat berada di luar klaster, dan klaim dapat mengembalikan alamat koneksi desktop, termasuk CDP untuk browser.
Sistem ini terdiri dari tiga bagian: pengontrol yang menjaga kumpulan mesin virtual Windows yang sudah dipanaskan, pod runner Linux yang menjalankan kode pengujian, dan mesin virtual Windows itu sendiri, yang menjalankan aplikasi yang diuji serta agen desktop kecil. Runner terhubung melalui CDP Playwright untuk konten browser, Appium untuk aplikasi native, dan aliran WebRTC yang memungkinkan orang menya
🇯🇵 日本語
E2exe:大規模な Windows デスクトップ自動化の課題を解決
Windows デスクトップアプリのテストは、毎月数千件のテストを並行して実行するインフラがどこにも存在しなかったため、顧客から最も多く求められてきた機能の一つでした。Web のテストは比較的容易です。ヘッドレスブラウザは Linux コンテナ内で数秒で起動し、コストはわずか数分の一セントで、テスト終了後には破棄されます。一方、Windows デスクトップのテストには同等の仕組みがありません。Windows コンテナにはグラフィカルデスクトップが含まれないため、テストごとに完全な仮想マシンが必要になります。コールドスタートの Windows VM は起動に 2〜3 分 かかり、さらに Windows UI Automation はアクティブなデスクトップセッション内でしか動作しないため、誰かがログインしている必要があります。また、マシンは実行間でインストール済みファイル、レジストリキー、ユーザープロファイル、保存されたログイン情報を保持し、各アプリはそれぞれ独自のインストーラー、管理者プロンプト、初回起動ダイアログを伴います。リモートの Windows マシンには組み込みのトレース、ログ、スクリーンショットがなく、ほとんどのテスト基盤は Linux を前提に設計されていました。
チームの解決策は、Windows マシンをスマートフォンのように扱うことでした。テストが一つのデバイスを確保し、一度だけ使い、そして破棄するという考え方です。このアーキテクチャは同社のモバイルテスト基盤から着想を得ています。Kubernetes 上のカスタムデバイススケジューラが、デバイスクレーム (Device Claim) を通じて Google Compute Engine 上の Windows VM を割り当て、テストは WebdriverIO と Appium を使ってそれを遠隔操作します。デバイスモデルには二つの拡張が必要でした。デバイスをクラスター外に置けること、そしてクレームがブラウザ用の CDP を含むデスクトップ接続アドレスを返せることです。
システムは三つの部分で構成されます。Windows VM のウォームプールを維持するコントローラー、テストコードを実行する Linux ランナーポッド、そして検証対象アプリと小型のデスクトップエージェントを動かす Windows VM 本体です。ランナーはブラウザのコンテンツには Playwright の CDP、ネイティブアプリには Appium で接続し、さらに WebRTC ストリームを通じて、人々がテストをライブで観察し、後から録画を確認できるようにします。
各 VM は使い捨てです。誰もログインせず、パッチを当てず、数週間にわたって稼働させることもなく、使用後は新しいマシンに置き換えられます。
Web アプリのようにコンテナ内で Windows デスクトップアプリをテストできないのはなぜですか?
Windows コンテナにはグラフィカルデスクトップが含まれず、Windows UI Automation はログイン済みのアクティブなデスクトップセッション内でしか動作しません。そのため各テストには完全な仮想マシンが必要で、ヘッドレスブラウザのコンテナよりも起動に時間がかかります。
🇧🇷 Português
E2exe: resolvendo a automação de desktop Windows em escala
Testar aplicativos de desktop Windows tem sido, por muito tempo, um dos recursos mais solicitados pelos clientes, porque ninguém tinha infraestrutura para executar milhares desses testes em paralelo todo mês. Testes para web são relativamente simples: um navegador headless inicia em um contêiner Linux em segundos, custa uma fração de centavo e é descartado quando o teste termina. Para testes de desktop Windows não existe equivalente. Cada teste precisa de uma máquina virtual completa, já que os contêineres Windows não incluem uma área de trabalho gráfica. Uma VM Windows iniciada a frio leva de 2 a 3 minutos para inicializar, e alguém precisa estar com a sessão logada, pois a automação de interface do Windows só funciona dentro de uma sessão de desktop ativa. As máquinas também mantêm entre execuções arquivos instalados, chaves do registro, perfis de usuário e logins salvos, enquanto cada aplicativo traz seus próprios instaladores, solicitações de administrador e caixas de diálogo de primeira execução. Máquinas Windows remotas não oferecem rastreamentos, logs ou capturas de tela integrados, e a maior parte da infraestrutura de testes foi projetada em torno do Linux.
A resposta da equipe foi tratar as máquinas Windows como celulares: um dispositivo que um teste reserva, usa uma vez e descarta. A arquitetura se inspira na infraestrutura de testes mobile da empresa. Um escalonador de dispositivos personalizado no Kubernetes entrega uma VM Windows no Google Compute Engine por meio de uma reserva de dispositivo (Device Claim), e o teste a controla remotamente com WebdriverIO e Appium. Foram necessárias duas extensões no modelo de dispositivos: os dispositivos podem estar fora do cluster, e as reservas podem retornar endereços de conexão de desktop, incluindo o CDP para navegadores.
O sistema tem três partes: um controlador que mantém um pool aquecido de VMs Windows, um pod de execução Linux que roda o código do teste, e a própria VM Windows, que executa o aplicativo testado e um pequeno agente de desktop. O executor se conecta pelo CDP do Playwright para o conteúdo do navegador, pelo Appium para aplicativos nativos e por um fluxo WebRTC que permite assistir aos testes ao vivo e revisar as gravações depois.
Cada VM é descartável. Ninguém faz login nela, aplica patches ou a mantém em funcionamento por semanas, e uma máquina nova substitui cada uma após o uso.
Por que aplicativos de desktop Windows não podem ser testados em contêineres como os aplicativos web?
Os contêineres Windows não incluem uma área de trabalho gráfica, e a automação de interface do Windows só funciona dentro de uma sessão de desktop ativa e logada. Por isso, cada teste precisa de uma máquina virtual completa, que demora mais para iniciar do que um contêiner de navegador headless.
🇷🇺 Русский
E2exe: автоматизация тестирования настольных приложений Windows в большом масштабе
Тестирование настольных приложений Windows уже давно входит в число самых востребованных у клиентов возможностей, поскольку ни у кого не было инфраструктуры, чтобы каждый месяц параллельно запускать тысячи таких тестов. Тестирование веб-приложений проще: безголовый браузер запускается в контейнере Linux за считанные секунды, стоит долю цента и удаляется по окончании теста. Для тестирования настольных приложений Windows аналога нет. Каждому тесту нужна полноценная виртуальная машина, поскольку в контейнерах Windows нет графического рабочего стола. Холодный запуск виртуальной машины Windows занимает от 2 до 3 минут, и в системе должен быть выполнен вход пользователя, так как автоматизация интерфейса Windows работает только в активном сеансе рабочего стола. Кроме того, между запусками машины сохраняют установленные файлы, разделы реестра, профили пользователей и сохранённые учётные данные, а каждое приложение приносит собственные установщики, запросы администратора и диалоги первого запуска. Удалённые машины Windows не предоставляют встроенных трассировок, журналов или скриншотов, а большая часть тестовой инфраструктуры изначально создавалась вокруг Linux.
Ответом команды стало отношение к машинам Windows как к телефонам: устройство, которое один тест занимает, использует один раз и затем выбрасывает. Архитектура заимствует подход из инфраструктуры мобильного тестирования. Пользовательский планировщик устройств в Kubernetes выдаёт виртуальную машину Windows в Google Compute Engine через запрос устройства (Device Claim), а тест управляет ею удалённо с помощью WebdriverIO и Appium. Модель устройств пришлось расширить двумя способами: устройства могут находиться за пределами кластера, а запросы могут возвращать адреса подключения к рабочему столу, включая CDP для браузеров.
Система состоит из трёх частей: контроллера, который поддерживает пул прогретых виртуальных машин Windows, пода-исполнителя на Linux, который выполняет код теста, и самой виртуальной машины Windows, на которой работают тестируемое приложение и небольшой агент рабочего стола. Исполнитель подключается через CDP Playwright к содержимому браузера, через Appium к нативным приложениям и через поток WebRTC, который позволяет наблюдать за тестами в реальном времени и просматривать записи после их завершения.
Каждая виртуальная машина одноразовая. Никто не входит в неё, не устанавливает обновления и не держит её запущенной неделями: после использования её заменяет новая машина.
Почему настольные приложения Windows нельзя тестировать в контейнерах, как веб-приложения?
Контейнеры Windows не включают графический рабочий стол, а автоматизация интерфейса Windows работает только внутри активного сеанса рабочего стола с выполненным входом. Поэтому каждому тесту нужна полноценная виртуальная машина, которая запускается дольше, чем контейнер с безголовым браузером.
🇨🇳 简体中文
E2exe:大规模解决 Windows 桌面自动化测试难题
长期以来,测试 Windows 桌面应用一直是客户最迫切的需求之一,因为没有人拥有每月并行运行数千次此类测试的基础设施。网页测试相对容易:无界面浏览器可以在 Linux 容器中数秒内启动,成本只是几分之一美分,测试结束后即被丢弃。Windows 桌面测试则没有对应的方案。每个测试都需要一台完整的虚拟机,因为 Windows 容器不包含图形桌面。一台冷启动的 Windows 虚拟机需要 2 至 3 分钟 才能启动,而且必须有用户登录,因为 Windows UI 自动化只能在活动的桌面会话中运行。机器在多次运行之间还会保留已安装的文件、注册表项、用户配置文件和已保存的登录信息,同时每个应用都带有各自的安装程序、管理员提示和首次运行对话框。远程 Windows 机器本身不提供内置的跟踪、日志或截图功能,而大多数测试基础设施都是围绕 Linux 设计的。
团队的解决方案是将 Windows 机器视为手机:一台设备被一个测试占用、只使用一次、然后丢弃。该架构借鉴了其移动测试基础设施。Kubernetes 中的一个自定义设备调度器通过设备声明(Device Claim)分配 Google Compute Engine 上的一台 Windows 虚拟机,测试则使用 WebdriverIO 和 Appium 远程控制它。设备模型需要进行两项扩展:设备可以位于集群之外,并且声明可以返回桌面连接地址,包括用于浏览器的 CDP。
该系统由三部分组成:一个维护预热 Windows 虚拟机池的控制器、一个执行测试代码的 Linux 运行器 Pod,以及运行被测应用和小型桌面代理的 Windows 虚拟机本身。运行器通过 Playwright 的 CDP 获取浏览器内容,通过 Appium 操作原生应用,并通过 WebRTC 流让人们实时观看测试,事后还可回放录制内容。
每台虚拟机都是一次性的。没有人会登录、修补或让它连续运行数周,每次使用后都会由一台全新的机器替换。
为什么 Windows 桌面应用不能像网页应用那样在容器中测试?
Windows 容器不包含图形桌面,而 Windows UI 自动化只能在活动的、已登录的桌面会话中运行。因此每个测试都需要一台完整的虚拟机,其启动速度比无界面浏览器容器慢。