Unit-Tests MFC-UI-Anwendungen?
Wie Sie unit-test eine große MFC-UI-Anwendung?
Wir haben ein paar große MFC-Anwendungen, die in der Entwicklung seit vielen Jahren verwenden wir einige standard-automatisierten QA-tools zum ausführen von basic-Skripts zu prüfen, Grundlagen, Datei öffnen etc. Diese werden von der QS-Gruppe post die daily-build.
Aber wir möchten die Einführung von Verfahren, so dass auch einzelne Entwickler können erstellen und ausführen von tests für Dialogfelder, Menüs und andere visuelle Elemente der Anwendung vor dem Absenden code, um das daily-build.
Ich habe von Techniken wie versteckte test-Tasten auf Dialoge, die erscheinen nur in debug-builds, gibt es irgendwelche standard-toolkits für diese.
Umgebung ist in C++/C/FORTRAN, MSVC 2005, Intel FORTRAN 9.1, Windows XP/Vista x86 & x64.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, wie die App aufgebaut ist. Wenn Logik und GUI-code ist getrennt (MVC) - dann testen Sie die Logik ist einfach. Werfen Sie einen Blick auf Michael Feathers "Demütige Dialog" (PDF).
EDIT: Wenn Sie darüber nachdenken: Sie sollten sehr vorsichtig umgestalten, wenn die App ist nicht so strukturiert, dass Art und Weise. Es gibt keine andere Technik, die für das testen der Logik. Skripte, die simulieren, Klicks sind nur verkratzen der Oberfläche.
Es ist eigentlich ziemlich einfach:
Davon aus, dass Ihr Steuerelement/Fenster/was auch immer änderungen, die den Inhalt einer listbox, wenn der Benutzer auf eine Schaltfläche klickt, und Sie wollen sicherstellen, dass das Listenfeld enthält das Zeug nach dem Klick.
Thats it. Der controller enthält die Logik-code und kennt die Steuerung nur über die Schnittstelle. Jetzt können Sie schreiben regelmäßig unit-test für MyController::ButtonWasClicked() durch Verspottung der Kontrolle. Wenn du keine Ahnung hast von was ich spreche, lese Michaels Artikel. Zweimal. Und sich danach wieder.
(Note to self: muss lernen, nicht um zu sabbeln viel)
Da Sie erwähnt MFC, bin ich davon ausgegangen, Sie haben eine Anwendung, die wäre schwer unter einer automatisierten Testumgebung. Sie beobachten die besten Vorteile von unit-testing-frameworks, die beim erstellen von tests, wie Sie den code schreiben.. Aber versuchen, eine neue Funktion hinzufügen, in einer test-driven Art und Weise zu einer Anwendung, die nicht entworfen, um testbar sein.. kann harte Arbeit sein und auch frustrierend.
Nun, was ich vorschlagen würde ist definitiv harte Arbeit.. aber mit etwas Disziplin und Durchhaltevermögen wirst du sehen, den Vorteil, früh genug.
Den einfachen Weg war meine Vorherige Antwort. Dies ist der schwierige aber richtige Weg.
Ich weiß, dies ist eine datierte Frage, aber für diejenigen von uns, die noch Arbeit mit MFC, der Microsoft C++ Unit-Test Framework in VS2012 gut funktioniert.
Das Allgemeine Verfahren:
Den https://stackoverflow.com/questions/1146338/error-lnk2005-new-and-delete-already-defined-in-libcmtd-libnew-obj hat eine gute Beschreibung, warum Sie benötigen, um die nafxcwd.lib libcmtd.lib.
Die andere wichtige Sache zu prüfen, in legacy-Projekten. Im Allgemeinen Konfigurationseigenschaften, stellen Sie sicher, dass beide Projekte sind mit dem gleichen 'Zeichensatz'. Wenn Ihr MFC ist mit einem Multi-Byte-Zeichensatz benötigen Sie den MS-Test, dies auch zu tun.
Wenn auch nicht perfekt, die beste, die ich gefunden habe, dafür ist AutoIt http://www.autoitscript.com/autoit3
"AutoIt v3 ist ein freeware BASIC-like scripting language, entwickelt für die Automatisierung von Windows GUI-und Allgemeinen scripting. Es verwendet eine Kombination von simulierten Tastatureingaben, Mausbewegungen und Fenster/control-manipulation, um Aufgaben zu automatisieren, die in einer Weise nicht möglich oder nicht zuverlässig mit anderen Sprachen (zB VBScript und SendKeys). AutoIt ist auch sehr klein, Selbstversorger und läuft auf alle Versionen von Windows-out-of-the-box ohne störende "Laufzeiten" erforderlich!"
Dies funktioniert gut, wenn Sie Zugriff auf den Quellcode der Anwendung getrieben werden, denn man kann die Ressourcen-ID, Anzahl der Steuerelemente, die Sie fahren möchten. Auf diese Weise brauchen Sie sich keine sorgen zu machen über simulierte Mausklicks auf bestimmte Pixel. Leider, in einer legacy-Anwendung, können Sie auch feststellen, dass die Ressourcen-ID nicht eindeutig sind, die möglicherweise Probleme verursachen. Aber. es ist sehr einfach zu ändern, die IDs eindeutig sein und neu erstellen.
Das andere Problem ist, dass Sie die Begegnung timing-Probleme. Ich habe nicht eine erprobte und wahre Lösung für diese. Versuch und Irrtum ist, was ich verwendet habe, aber das ist einfach nicht skalierbar. Das problem ist, dass das AutoIT-Skript muss warten, bis der test-Anwendung reagieren auf einen Befehl, bevor das Skript Probleme mit dem nächsten Befehl oder überprüfen, ob die richtige Antwort. Es ist manchmal nicht leicht zu finden, ein bequemer Ereignis warten und zusehen.
Mein Gefühl ist, dass, in eine neue Anwendung entwickeln, würde ich darauf bestehen, eine konsistente signal "READY". Dies wäre hilfreich, um den menschlichen Benutzer als auch als test-scripts! Dies kann eine Herausforderung für eine legacy-Anwendung, aber vielleicht kann man das einführen, es auf problematische Punkte und langsam breitete Sie die gesamte Anwendung zu Wartung weiter.
Obwohl es nicht umgehen kann das UI-Seite, ich unit test MFC-code mit dem Boost-Test-library. Gibt es einen Code, Projekt-Artikel über erste Schritte:
Der Gestaltung Robust Objekte mit Boost
Gut, wir haben eines dieser gigantischen MFC-Apps am Arbeitsplatz. Seine eine gigantische Schmerzen zu erhalten oder zu verlängern... es ist ein riesiger ball aus Schlamm jetzt, aber es Rechen in der moolah.Sowieso
Anderen Ansatz, der einigen Erfolg gehabt hat, ist das erstellen einer kleinen Produkt-spezifische Sprache und Skript testet, die VBScript und einigen " Griff-Spionage Magie. Drehen Sie gemeinsame Aktionen in Befehle.. wie z.B. OpenDatabase wäre ein Befehl, der wiederum injizieren Sie das erforderliche Skript-Blöcke zu klicken Sie auf Hauptmenü - > Datei - > "Öffnen...". Erstellen Sie dann die excel-sheets, die eine Reihe solcher Befehle. Diese Befehle können Parameter enthalten, zu. So etwas wie ein FIT-Test.. aber mehr Arbeit. Sobald Sie die meisten der gängigen Befehle identifiziert und Skripte bereit. Es abholen und montieren-Skripte (tagged durch CommandIDs) zum schreiben neuer tests. Ein test-runner analysiert diese Excel-sheets, vereint all die kleinen script-Blöcke in einem test-Skript und führt es aus.
HTH
Eigentlich haben wir mit Rational-Team-Test, dann einen Roboter, aber in den letzten Diskussionen mit Rational wir entdeckten, dass Sie haben keine Pläne, die Unterstützung für Native x64-Anwendungen mit Schwerpunkt mehr auf .NET, so dass wir beschlossen zu wechseln Automatisierten QA-tools. Das ist großartig, aber die Lizenzierung kostet nicht erlauben, uns zu ermöglichen, für alle Entwickler.
Alle unsere Anwendungen unterstützt eine COM-API für Skripte, die wir Regressionstest über VB, aber diese tests der API nicht die Anwendung als solches.
Ideal mich würde interessieren, wie die Menschen integrieren, cppunit und ähnlich wie unit-testing-frameworks in der Anwendung auf Entwickler-Ebene.