Frage

Wie Sie Unit-Test eine große MFC UI-Anwendung?

Wir haben einige große MFC-Anwendungen, die seit vielen Jahren in der Entwicklung haben wir einige Standard automatisierte QA-Tools verwenden, um grundlegende Skripte auszuführen Grundlagen zu überprüfen, Datei öffnen etc. Diese durch die QA-Gruppe den täglichen Build Post ausgeführt werden.

Wir möchten aber, Verfahren einzuführen, so dass die einzelnen Entwickler und Lauftests gegen Dialoge aufbauen können, Menüs und andere visuelle Elemente der Anwendung vor dem Code an den täglichen Build einreichen.

Ich habe als versteckte Test-Tasten auf Dialoge solcher Techniken gehört, die im Debug-Builds erscheinen nur, gibt es Standard-Toolkits für diese.

Umwelt ist C ++ / C / Fortran, MSVC 2005 Intel Fortran 9.1, Windows XP / Vista x86 und x64.

War es hilfreich?

Lösung

Es hängt davon ab, wie die App strukturiert ist. Wenn Logik und GUI Code getrennt ist (MVC) dann geht die Logik zu testen ist einfach. Werfen Sie einen Blick auf Michael Feathers "Humble Dialogfeld" (PDF).

EDIT: Wenn man darüber nachdenkt: Sie sollten sehr sorgfältig Refactoring, wenn der App nicht auf diese Weise strukturiert ist. Es gibt keine andere Technik, um die Logik zu testen. Skripte, die Klicks simulieren kratzen nur an der Oberfläche.

Es ist eigentlich recht einfach:

Angenommen, Ihre Steuerung / Fenster / was auch immer den Inhalt einer Listbox ändert sich, wenn der Benutzer auf eine Schaltfläche klickt, und Sie wollen sicherstellen, dass die Listbox das Zeug nach dem Klick enthält.

  1. Umgestalten, so dass es eine separate Liste mit den Einzelteilen für die Listbox zu zeigen. Die Elemente werden in der Liste gespeichert und werden nicht extrahiert von jedem beliebigen Ort Ihre Daten stammen aus. Der Code, der die Listbox Liste Dinge macht weiß, nur über die neue Liste.
  2. Dann erstellen Sie ein neues Controller-Objekt, das den Logik-Code enthält. Die Methode, die auf die Schaltfläche klicken nur Griffe ruft mycontroller-> ButtonWasClicked (). Es weiß nicht, über die Listbox oder anythings anderes.
  3. MyController :: ButtonWasClicked () tut, was für die vorgesehene Logik durchgeführt werden müssen, bereitet die Artikelliste und erzählt die Steuerung zu aktualisieren. Dafür arbeiten müssen Sie durch die Schaffung eine Schnittstelle (rein virtuelle Klasse) für die Steuerung der Steuerung und die Kontrolle entkoppeln. Der Controller kennt nur ein Objekt dieser Art, nicht die Kontrolle.

Das ist es. Der Controller enthält die Logik-Code und kennt die Steuerung nur über die Schnittstelle. Jetzt können Sie regelmäßigen Unit-Test für MyController schreiben :: ButtonWasClicked () mit der Kontrolle spöttisch. Wenn Sie keine Ahnung, was ich rede, Artikel lesen Michaels. Zweimal. Und wieder danach.
(Notiz an mich selbst: müssen lernen, nicht so viel quasseln)

Andere Tipps

Da Sie MFC erwähnt, nahm ich an Dich eine Anwendung, die schwer zu bekommen unter einer automatisierten Testumgebung sein würde. Sie werden am besten Vorteile der Einheit Test-Frameworks beobachten, wenn Sie Tests zu bauen, wie Sie den Code schreiben .. Doch der Versuch, eine neue Funktion in einem Test-Driven Weise zu einer Anwendung hinzuzufügen, die nicht als prüfbar ausgelegt ist .. kann harte Arbeit sein und auch frustrierend.

Nun, was ich vorschlagen werde auf jedem Fall ist harte Arbeit .. aber mit etwas Disziplin und Ausdauer werden Sie den Vorteil früh genug sehen.

  • Zuerst werden Sie einige Management-Unterstützung benötigen für neue Fixes ein wenig länger dauern. Stellen Sie sicher, dass jeder versteht, warum.
  • kaufen nächstes eine Kopie des Welc Buch . Lesen sie decken zu decken, wenn Sie die Zeit haben, oder wenn Sie sich schwer sind, scannen Sie den Index, das Symptom zu finden Ihre Anwendung ausstellt. Dieses Buch enthält eine Menge guter Ratschläge und ist genau das, was Sie brauchen, wenn sie versuchen, vorhandene Code testbar zu bekommen. alt text
  • Dann gilt für jeden neue Update / Wechsel, einige Zeit verbringen und verstehen, den Bereich, den Sie arbeiten gehen. Schreiben Sie einige Tests in einer xUnit Variante Ihrer Wahl (frei verfügbar) aktuelles Verhalten auszuüben.
  • Stellen Sie sicher, dass alle Tests bestanden. Schreiben Sie einen neuen Test, die benötigt Verhalten oder den Bug ausübt.
  • Code über, um diesen letzten Testdurchlauf zu machen.
  • Umgestalten gnadenlos im Bereich unter Tests Design zu verbessern.
  • Wiederholen Sie für jede neue Änderung, die man von hier aus auf das System zu machen. Keine Ausnahmen von dieser Regel.
  • Jetzt das gelobte Land : Bald jemals Inseln gut getesteten Code wachsen beginnt an der Oberfläche. Immer mehr Code würde unter der automatisierten Testsuite fallen und Änderungen werden immer einfacher zu machen. Und das liegt daran, langsam und sicher das zugrundeliegende Design mehr testbar wird.

Der einfache Ausweg war meine Antwort. Dies ist die schwierige, aber richtige Weg.

Ich weiß, das eine datierte Frage, aber für diejenigen von uns, die mit MFC immer noch funktionieren, funktioniert die Microsoft C ++ Unit Testing Framework in VS2012 gut.

Das allgemeine Verfahren:

  1. Stellen Sie sich Ihr MFC-Projekt als eine statische Bibliothek
  2. Fügen Sie eine neue Mutter Einheit Test-Projekt zu Ihrer Lösung.
  3. Im Testprojekt, das MFC-Projekt als Referenz hinzuzufügen.
  4. In der Konfigurationseigenschaften der Testprojekt, fügen Sie die Include-Verzeichnisse für Ihre Header-Dateien.
  5. Im Linkers, Eingabeoptionen fügen Sie Ihre MFC.lib; Nafxcwd.lib; LIBCMTD.LIB;
  6. Unter 'Ignorieren Specific Standard Libraries' add Nafxcwd.lib; LIBCMTD.LIB;
  7. Sie unter Allgemein fügen Sie den Speicherort Ihrer MFC exportiert Lib-Datei.

Die https: // Stackoverflow. com / Fragen / 1146338 / Fehler-LNK2005-new-and-löschen-bereits definierten-in-libcmtd-libnew-obj eine gute Beschreibung hat, warum Sie die Nafxcwd.lib und LIBCMTD.LIB benötigen.

Die andere wichtige Sache zu prüfen in Legacy-Projekten. In Allgemeine Konfigurationseigenschaften, stellen Sie sicher, dass beide Projekte denselben ‚Zeichensatz‘ verwenden. Wenn Ihr MFC ist ein Multi-Byte-Zeichensatz verwenden Sie die MS Test benötigen, um gut zu tun.

Obwohl nicht perfekt, das Beste, was ich für diese gefunden haben, ist AutoIt http://www.autoitscript.com/ autoit3

"AutoIt v3 ist eine Freeware-BASIC-ähnliche Skriptsprache entwickelt, für das Windows-GUI-Scripting und allgemeine Automatisierung. Es verwendet eine Kombination von simulierten Tastatureingaben, Mausbewegungen und Fenster / Steuer Manipulation, um Aufgaben in einer Art und Weise zu automatisieren nicht möglich oder zuverlässig mit anderen Sprachen (zB VBScript und Sendkeys). AutoIt auch sehr klein ist, in sich geschlossene und wird auf allen Versionen von Windows out-of-the-box ohne lästige „Runtimes“ erforderlich! "

laufen

Das funktioniert gut, wenn Sie Zugriff auf den Quellcode der Anwendung haben angetrieben, weil Sie die Ressource-ID-Nummer der Steuerelemente verwenden, können Sie fahren möchten. Auf diese Weise müssen Sie sich nicht über simulierte Mausklicks auf bestimmte Pixel sorgen. Leider in einer Legacy-Anwendung, finden Sie auch, dass die Ressourcen-ID nicht eindeutig zuzuordnen sind, die Probleme verursachen können. Jedoch. es ist sehr einfach, die IDs zu ändern, einzigartig zu sein und wieder aufzubauen.

Das andere Problem ist, dass Sie Timing-Probleme auftreten werden. Ich habe nicht eine bewährte Lösung für diese. Versuch und Irrtum ist es, was ich verwendet habe, aber das ist eindeutig nicht skalierbar. Das Problem ist, dass das AutoIT Skript warten muss für die Testanwendung auf einen Befehl zu reagieren, bevor das Skript den nächsten Befehl oder überprüfen Sie die richtige Antwort gibt. Manchmal ist es nicht einfach, eine günstige Veranstaltung zu finden, zu warten und zu beobachten.

Mein Gefühl ist, dass eine neue Anwendung in der Entwicklung, ich auf eine konsistente Art und Weise bestehen würde „READY“ zu signalisieren. Dies wäre hilfreich für den menschlichen Benutzer sowie Testskripts! Dies kann eine Herausforderung für eine Legacy-Anwendung, aber vielleicht können Sie es in problematischen Punkte einzuführen und breitete sie langsam auf die gesamte Anwendung als Wartung weiter.

Auch wenn es die Benutzeroberfläche Seite nicht verarbeiten kann, ich Unit-Test-MFC-Code der Boost-Test-Bibliothek. Es gibt einen Code Project Artikel zu den ersten Schritten:

Designing Robust Objekte mit Boost-

Nun haben wir eine dieser humongous MFC Apps am Arbeitsplatz sorgen. Es ist ein riesiger Schmerz zu erhalten oder zu erweitern ... seine eine riesige Kugel aus Schlamm nun aber es Rechen in der moolah.Anyways

  • Wir verwenden Rational Robot für Rauchversuche machen und dergleichen.
  • Ein weiterer Ansatz, der einen gewissen Erfolg gehabt hat, ist ein kleines produktspezifische Sprache und Skript-Tests , die Spionage Magie VBScript und einige Kontrollgriff verwenden zu erstellen. Schalten gemeinsame Aktionen in Befehle .. z.B. Opendatabase wäre ein Befehl sein, dass wiederum die erforderlichen Skriptblöcke zu klicken Sie auf Hauptmenü> Datei> injizieren „Öffnen ...“. Anschließend erstellen Sie Excel-Sheets, die eine Reihe solcher Befehle sind. Diese Befehle können auch Parameter übernehmen. So etwas wie ein FIT-Test .. aber mehr Arbeit. Sobald Sie haben die meisten der üblichen Befehle identifiziert und Skripts bereit. Es ist auswählen und zusammenbauen Skripte (getaggt durch CommandIDs) zu neuen Tests zu schreiben. Ein Test-Läufer analysiert diese Excel-Sheets, vereint alle kleinen Skriptblöcke in einem Testskript und führt es aus.

    1. Opendatabase "C: \ Tests \ MyDB"
    2. Opendialog "Add Model"
    3. AddModel "M0001", "MyModel", 2.5, 100
    4. PressOK
    5. SaveDatabase

HTH

Eigentlich haben wir Rational Team Test wurde unter Verwendung, dann Roboter, aber in den letzten Gesprächen mit Rational wir entdeckten sie keine Pläne haben india x64-Anwendungen zu unterstützen mehr auf .NET konzentriert, so dass wir beschlossen automatisierte QA Werkzeuge wechseln. Das ist großartig, aber die Lizenzkosten erlauben uns nicht, es für alle Entwickler zu ermöglichen.

Alle unsere Anwendungen unterstützen eine COM API für Scripting, die wir Test über VB Regression, aber diese Tests, um die API nicht die Anwendung als solche.

Im Idealfall würde ich interessieren, wie die Menschen integrieren cppunit und ähnliches Einheit Test-Frameworks in die Anwendung auf einer Entwickler-Ebene.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top