Dieser Artikel wurde maschinell übersetzt.

Testlauf

Anforderung/Antwort-Tests mit IronPython

James McCaffrey

Downloaden des Codebeispiels

James McCaffreyIch bin ein großer Fan der Verwendung der Programmiersprache Python für verschiedene einfache Automatisierung Testaufgaben. Im Artikel dieses Monats ich zeigen, wie IronPython verwenden – eine Microsoft .NET Framework-kompatiblen Python-Implementierung – HTTP-Anforderungs-Antwort für ASP.NET-Webanwendungen Tests durchführen.

Insbesondere erstellen Sie ein kurzer Test Testumgebung Skript, die Ausübung einer ASP.NET-Anwendung simuliert. Die IronPython-Umgebung stellt programmgesteuerten HTTP-Anforderung von Informationen für die Anwendung auf einem Webserver. Es ruft dann den HTTP-Antwortstream
und untersucht den HTML-Text für ein erwarteter Wert Art ein Erfolg/Misserfolg Ergebnis zu ermitteln. Neben dem eine nützliche
Testen der Technik in seine eigene rechts, lernen, wie Sie HTTP-Anforderungs-Antwort-Tests mit IronPython durchführen ist eine hervorragende Möglichkeit, die Sprache IronPython kennen lernen.

Diese Spalte wird vorausgesetzt, dass Sie grundlegende Kenntnisse im Umgang mit der ASP.NET-Technologie und fortgeschrittene Kenntnisse mit einer Sprache, wie z. B. JavaScript, Windows PowerShell, VBScript, Perl, PHP oder Ruby, aber ich Skripts Don ’t angenommen, Sie verfügen über Erfahrungen mit Python. Jedoch auch dann, wenn Sie mit ASP.NET und Skripts vertraut sind, sollten Sie immer noch die Spalte ohne zu viele Probleme folgen können. Am besten sehen, worauf ich bin besteht darin, die Bildschirmfotos in Abbildungen 1 und 2-untersuchen.

Abbildung 1 veranschaulicht das Beispiel ASP.NET-Webanwendung unter Testbedingungen. Das zu testende System ist ein einfaches, aber repräsentative Web
Die Anwendung mit dem Namen MiniCalc. Ich gehalten absichtlich testenden ASP.NET Web-Anwendung so einfach wie möglich, damit ich die wichtigsten Punkte der IronPython-Testautomatisierung verbergen nicht. Realistische Webanwendungen erheblich komplexer sind als die dummy MiniCalc Anwendung in Abbildung 1 , aber die IronPython-Tests Technik hier einfach beschrieben, um komplexe Anwendungen darstellt. Die Webanwendung MiniCalc akzeptiert zwei numerische Werte, die ein Hinweis darauf, hinzuzufügen oder zu multiplizieren Sie die Werte und die Anzahl der Dezimalstellen, die Antwort angezeigt. Die Anwendung sendet dann die Werte auf einem Webserver, in das Ergebnis berechnet. Der Server erstellt die HTML-Antwort und sendet es an den Clientbrowser, in dem das Ergebnis der Anzahl der Dezimalstellen, die vom Benutzer angegebene angezeigt.

Figure 1 MiniCalc Web App Under Test

Abbildung 1 MiniCalc Web-Anwendung unter Test

Abbildung 2 zeigt eine IronPython-Testumgebung in Aktion. Das Skript harness.py Namen und akzeptiert keine Befehlszeilenargumente. Der Einfachheit halber habe ich hart codierte Informationen, einschließlich der URL der Webanwendung und den Namen der Eingabedatei Testfall. Meine Testumgebung beginnt mit der Wiedergabe des Ziel-URL des http://localhost/MiniCalc/Default.aspx. Im Testfall 001 bucht meiner Testumgebung programmgesteuert Informationen entspricht, die einem Benutzer eingeben 1,23 in TextBox1-Steuerelement 4.56 in TextBox2 eingeben RadioButton1 (zum Anzeigen eine Operation hinzufügen) 4 aus dem DropDownList1-Steuerelement auswählen und auf Button1 (zu berechnen) auswählen. Hinter den Kulissen der Testumgebung die HTTP-Antwort vom Server erfasst und sucht anschließend die Antwort für ein Hinweis darauf, dass 5.7900 (die richtige Summe 1,23 und 4.56 bis 4 Dezimalstellen) im Steuerelement "TextBox3" Ergebnis ist. Die Testumgebung Tracks Fällen die Anzahl der Tests, übergeben und die Anzahl, die fehlschlagen, und die Ergebnisse angezeigt, nachdem alle Testfälle verarbeitet wurden.

Figure 2 Testing the App Using IronPython

Abbildung 2 Testen der Anwendung, die mithilfe von IronPython

In den folgenden Abschnitten, beschreibe ich kurz die testende Webanwendung, damit Sie wissen, genau wie getestet wird. Als Nächstes schrittweise ich die Details zum Erstellen von einfachen HTTP-Anforderung / Antwort-Automatisierung mithilfe von IronPython. Ich umbrechen indem einige Meinungen zu bei die Verwendung von IronPython geeignet ist und wenn andere Verfahren besser geeignet sind. Ich denke, die interessante Informationen und eine nützliche Ergänzung zu Ihrer Tests Toolset finden werden.

Die zu testende Anwendung

Let’s sehen Sie sich den Code für die MiniCalc ASP.NET Web-Anwendung, die das Ziel der Testautomatisierung ist. Die Anwendung mit Visual Studio 2008 erstellte. Nach dem Starten von Visual Studio mit Administratorberechtigungen, klickte ich auf Datei | neu | Website. Um zu vermeiden, den ASP.NET Code-Behind-Mechanismus, und halten den Code für meine Webanwendung in einer einzigen Datei, ich die Option leere Website ausgewählt. Http://localhost/MiniCalc im Feld Pfad wurde angegeben. Ich beschloss, das Verwenden von c# für die Anwendung MiniCalc, aber die Testumgebung, die ich Präsentation bin in dieser Spalte funktioniert mit ASP.NET-Anwendungen in VB.NET geschrieben, und mit geringfügigen Änderungen, die der Testumgebung Webanwendungen mithilfe von Technologien wie z. B. das klassische ASP, CGI, PHP, JSP und Ruby geschrieben zugeordnet werden kann. Klicken OK im Dialogfeld Neue Website, die von der Webanwendung erzeugen. Als Nächstes wurde das Fenster Projektmappen-Explorer auf den Projektnamen MiniCalc Ebene und neues Element hinzufügen aus dem Kontextmenü ausgewählt. Ich habe dann Web Form aus der Liste der installierten Vorlagen ausgewählt und akzeptiert den Namen Default.aspx. Die Option “ Code in eigener Datei platzieren ” deaktiviert, und dann auf die Hinzufügen-Schaltfläche geklickt. Als Nächstes doppelgeklickt ich auf dem Dateinamen "default.aspx" im Projektmappen-Explorer, den Vorlage generiert Code zu bearbeiten. Den Vorlagencode gelöscht, und ersetzt ihn durch den Code in Abbildung 3 dargestellt.

Abbildung 3 MiniCalc Code

<%@ Page Language="C#" %>
<script runat="server">
  private void Button1_Click(object sender, System.EventArgs e)
  {
    double alpha = double.Parse(TextBox1.Text.Trim());
    double beta = double.Parse(TextBox2.Text.Trim());
    string formatting = "F" + DropDownList1.SelectedValue;
    if (RadioButton1.Checked)
      TextBox3.Text = Sum(alpha, beta).ToString(formatting);
    else if (RadioButton2.Checked)
      TextBox3.Text = Product(alpha, beta).ToString(formatting);
    else
     TextBox3.Text = "Select method";
  }
  private static double Sum(double a, double b)
  {
    return a + b;
  }
  private static double Product(double a, double b)
  {
    return a * b;
  }
</script>
<html>
  <head>
    <style type="text/css">
     fieldset { width: 16em }
     body { font-size: 10pt; font-family: Arial }
    </style>
    <title>Default.aspx</title>
    </head>
  <body bgColor="#ccffff">
    <h3>MiniCalc by ASP.NET</h3>
    <form method="post" name="theForm" id="theForm" runat="server"             action="Default.aspx">
      <p><asp:Label id="Label1" runat="server">Enter number:&nbsp</asp:Label>
      <asp:TextBox id="TextBox1" width="100" runat="server" /></p>
      <p><asp:Label id="Label2" runat="server">Enter another:&nbsp</asp:Label>
      <asp:TextBox id="TextBox2" width="100"  runat="server" /></p>
      <p></p>
      <fieldset>
        <legend>Arithmentic Operation</legend>
        <p><asp:RadioButton id="RadioButton1" GroupName="Operation"                 runat="server"/>Addition</p>
        <p><asp:RadioButton id="RadioButton2" GroupName="Operation"                 runat="server"/>Multiplication</p>
        <p></p>
      </fieldset>
    <p>Decimals: &nbsp;&nbsp;
      <asp:DropDownList ID="DropDownList1" runat="server">
      <asp:ListItem>3</asp:ListItem>
      <asp:ListItem>4</asp:ListItem>
      </asp:DropDownList>
    </p>
      <p><asp:Button id="Button1" runat="server" text=" Calculate "            onclick="Button1_Click" /></p>
      <p><asp:TextBox id="TextBox3" width="120"  runat="server" />
    </form>
  </body>
</html>

Zu meinem Quellcode klein und leicht verständlich, bin ich Tastenkombinationen wie z. B. keine Fehlerprüfung und Kombinieren von serverseitigen Steuerelemente (z. B. < Asp: TextBox >) mit einfachem HTML-Code (z. B. <fieldset>) durchführen durchführt. Die wichtigsten Teile des Codes in Abbildung 3 sind die IDs der serverseitige ASP.NET-Steuerelemente. Verwendung des Standard-IDs Label1 (Eingabeaufforderung), TextBox1 und TextBox2 (Eingabe für zwei Ziffern), RadioButton1 und RadioButton2 (Auswahl der Addition oder Multiplikation) DropDownList1 (Anzahl der Dezimalstellen für das Ergebnis), Button1 (berechnet) und "TextBox3" (Ergebnis). Automatisierte HTTP-Anforderungs-Antwort für eine ASP.NET-Anwendung mit dem Verfahren, das ich hier vorstellen Tests durchführen möchten, müssen Sie die IDs der Steuerelemente der Anwendung kennen. In diesem Fall habe ich den Quellcode zur Verfügung, da ich die Anwendung selbst, aber auch dann, wenn Sie eine Webanwendung testen sind, die Sie geschrieben haben, können immer die Anwendung mithilfe eines Webbrowsers Datenquelle Funktionalität untersuchen.

Um zu überprüfen, dass meine testende Webanwendung ordnungsgemäß erstellt wurde, drücken ich die <F5>-Taste. Klicken OK im resultierenden Dialogfeld Debuggen nicht aktiviert Visual Studio zum Ändern von Web.config-Datei der Webanwendung angewiesen. Visual Studio dann Internet Explorer gestartet und MiniCalc geladen. Beachten Sie, dass das Aktionsattribut des Meine <form> Element Default.aspx festgelegt ist. Das heißt, jedes Mal, wenn ein Benutzer eine Anforderung sendet, der gleiche default.aspx-Seitencode ausgeführt. Dadurch können meine MiniCalc Webanwendung eine Folge von verschiedenen Webseiten, anstatt das Verhalten einer Anwendung. Da HTTP ein statusfreies Protokoll ist, führt ASP.NET die Auswirkungen der Anwendung mithilfe der Webanwendung Status in einem speziellen ausgeblendeten Werttyp, der ViewState aufgerufen. Wie Sie in Kürze sehen werden, ist der Umgang mit einer ASP.NET-Anwendung ViewState einer der Schlüssel zum Bereitstellen von Daten an die Anwendung programmgesteuert.

Anforderung-Antwort-Testen mit IronPython von ASP.NET

Sprechen Sie Let’s Testprogramm Testumgebung die IronPython, das im Bildschirmfoto in Abbildung 2 erstellt. IronPython ist ein kostenloser Download von CodePlex, der Microsoft gesponserte open-Source-Projekt ironpython.codeplex.com-zur Verfügung. Ich verwende in der Version 2.6.1, die auf Version 2.0 von .NET Framework ausgeführt wird, und führt auf jedem Computer, der die Framework-Version unterstützt. Die allgemeine Struktur des meiner Testumgebung Testskripts werden in Abbildung 4 vorgestellt.

Abbildung 4 Struktur der Testumgebung

set up imports
define helper functions
try:
  initialize variables
  open test case data file
  loop
    read a test case from file
    parse test case data
    determine ViewState
    determine EventValidation
    construct request string
    send request string to app
    fetch response from app
    determine if response has expected result
    print pass or fail
  end loop
  close test case data file
  print summary results
except:
  handle exceptions

Wie Sie sehen können, ist meine Testumgebung Skript ist einfach und wird gesteuert, die durch eine externe Testfall-Datendatei. Die Datendatei Testfall testCases.txt heißt und besteht aus:

001|1.23|4.56|RadioButton1|4|clicked|5.7900
002|1.23|4.56|RadioButton2|4|clicked|5.7900
003|2.00|3.00|RadioButton1|4|clicked|5.0000

Jede Zeile stellt einen Testfall und verfügt über sieben Felder getrennt durch ein “ | ” Zeichen. Das erste Feld ist eine Testfall. Die zweite und dritte Felder sind Eingaben in TextBox1 und TextBox2. Das vierte Feld codiert, ob Addition oder Multiplikation anfordern. Das fünfte Feld ist der Wert für die Dezimalstellen DropDownList-Steuerelement. Das sechste Feld (“ geklickt ”) ist das Button1-Ereignis. Das siebte Feld ist das erwartete Ergebnis in "TextBox3" angezeigt werden soll. Die zweite Testfall stimmt nicht absichtlich einfach um einen Testfall Fehler zu veranschaulichen. Für die einfache Tests Ansatz, die ich hier beschrieben habe, ist eine einfache Textdatei Testfalldaten enthalten häufig eine gute Wahl. Wenn ich hatte meinen Testfall-Daten direkt in die Testumgebung Skript eingebettet, könnte ich mit einem Array von Zeichenfolgen wie geschehen:

testCases = ['001|1.23|4.56|RadioButton1|4|clicked|5.7900',
             '002|1.23|4.56|RadioButton2|4|clicked|5.7900',
             '003|2.00|3.00|RadioButton1|4|clicked|5.0000']

und dann wie jeden Testfall durchlaufen:

for line in testCases: ...

Python verfügt außerdem über einen Listentyp, der zum Speichern von Testfalldaten verwendet werden kann.

Die ersten drei Zeilen von meiner Testumgebung IronPython sind:

# harness.py import sys import clr

Kommentare in Python beginnen mit dem Zeichen “ # ” und zum Ende der Zeile erweitern. “ Importieren Sys ”-Anweisung ermöglicht das Skript den Zugriff auf Ressourcen im besonderen IronPython Sys-Modul.

Die Speicherorte dieser Ressourcen können ein sys.path-Befehls in der interaktiven IronPython-Konsole aufgeführt werden. “ Import Clr ”-Anweisung ermöglicht das Skript Zugang und die Verwendung der Kernfunktionen von .NET CLR.

Meiner nächsten sechs Anweisungen aktivieren explizit meiner Testumgebung verwendet .NET-Funktionalität:

from System import *
from System.IO import *
from System.Text import *
from System.Net import *
clr.AddReference('System.Web')
from System.Web import *

Hier die erste Zeile System importiert und ist vergleichbar mit der Anweisung “ mit dem Dienstprogramm System ” in einem C#-Programm. Die “ importieren Clr ”-Anweisung enthält den System-Namespace, damit ich auslassen konnte die “ vom System Import * ” Anweisung, aber es vorziehen, lassen Sie es als eine Art der Dokumentation. Die folgenden drei Anweisungen schalten den System.IO (für Dateioperationen), "System.Text" (für die Konvertierung von Byte) und System.NET (für Anforderung - Antwort-Funktionalität ­)-Namespace in den Bereich. Die “ clr.AddReference (‘ Sys ­ tem.Web ’) ” Anweisung bringt den System.Web-Namespace in den Bereich. Dieser Namespace ist nicht direkt verfügbar ist, wird standardmäßig so, dass ich die AddReference-Methode verwenden müssen, bevor ich ausgeben der “ aus System.Web-Import * ” Anweisung, damit die URL-Codierung Methoden zugegriffen werden kann.

Als Nächstes definieren Sie eine Hilfsmethode zum Abrufen der ViewState-Informationen für die Webanwendung unter Testbedingungen:

def getVS(url):
  wc = WebClient()
  bytes = wc.DownloadData(url)
  html = Encoding.ASCII.GetString(bytes)
  start = html.IndexOf('id="__VIEWSTATE"', 0) + 24
  end = html.IndexOf('"', start)
  vs = html.Substring(start, end-start)
  return vs

Denken Sie daran, dass da HTTP ein statusfreies Protokoll, ASP.NET den Effekt, dass es eine statusbehaftete Anwendung durch Verwalten des Anwendungszustands in einem ausgeblendeten Wert mit der Bezeichnung ViewState ermöglicht. Ein ViewState-Wert ist eine Base64-codierte Zeichenfolge, die den Zustand einer ASP.NET-Seite über mehrere Anforderung/Antwort-Roundtrips verwaltet. In ähnlicher Weise ein EventValidation-Wert wurde in ASP.NET 2.0 hinzugefügt und wird aus Sicherheitsgründen verwendet, um Angriffe Skript einfügen. Diese beiden Mechanismen sind Daten zu einer ASP.NET-Webanwendung programmgesteuert übermitteln.

In Python müssen Sie die Funktionen definieren, bevor Sie diese in einem Skript aufrufen. Funktionen werden mithilfe von Def-Schlüsselwort definiert. Die Hilfsfunktion instanziiert zunächst ein WebClient-Objekt. Als Nächstes DownloadData-Methode sendet eine HTTP-Anforderung an die Webanwendung, die vom Parameter Url und die HTTP-Antwort als ein Array von Bytewerten abruft. Ich verwende die GetString-Methode zur Konvertierung von Byte in eine Zeichenfolge mit dem Namen html. ViewState-Element sieht folgendermaßen aus:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
 value="/wEPDwULLTEwNjU=" />

Um den Wert zu extrahieren, ich zunächst bestimmen die Position der Teilzeichenfolge-Id = "__VIEWSTATE", und fügen Sie 24 Zeichen. Dieser Ansatz ist in dem Sinne, die die Technik unterbrochen wird, wenn ASP.NET ändert sich das Format der Zeichenfolge ViewState zerbrechliche, aber da einfache Automatisierung, trumps Einfachheit Stabilität. Kann ich ermitteln, wo das abschließende Anführungszeichen ist und ich kann die Substring-Methode zum Extrahieren des ViewState-Wert verwenden. Im Gegensatz zu den meisten Sprachen, welche Tokens verwendet z. B.... End oder {...} zum Begrenzen von Codeblöcken beginnen, verwendet Python Einzug. Wenn Sie mit der Python-Programmierung vertraut sind, mag dies zuerst, aber die meisten Entwickler bei ungeraden ich erläutert habe, sagen Sie schnell mit der Syntax verwendet werden. Python wird durch eine Auflistung von Modulen unterstützt, daher ist eine Alternative zur Verwendung von .NET Methoden zum Abrufen des Werts von ViewState Funktionen im systemeigenen Python Urllib Modul verwendet.

Nach dem Definieren der Hilfsfunktion GetVS, definiere ich eine Hilfsfunktion zum Abrufen des Wertes EventValidation:

def getEV(url):
  wc = WebClient()
  bytes = wc.DownloadData(url)
  html = Encoding.ASCII.GetString(bytes)
  start = html.IndexOf('id="__EVENTVALIDATION"', 0) + 30
  end = html.IndexOf('"', start)
  ev = html.Substring(start, end-start)
  return ev

Ich verwende das gleiche Verfahren, um EventValidation zu extrahieren, wie ViewState extrahieren. Beachten Sie, dass Python als dynamisch typisierte Sprache, so dass die Datentypen, Parametern, Variablen und Objekte nicht angegeben wird. Z. B. DownloadData gibt ein Bytearray zurück und IndexOf gibt einen Int und der IronPython-Interpreter wird herausfinden dieser Typen für mich. Definieren zwei Funktionen, GetVS und GetEV, erfordert zwei Roundtrip-Aufrufe an die Webanwendung unter Testbedingungen, so, dass Sie zwei Hilfsfunktionen in einer einzigen Funktion und den Namen kombinieren möchten den Helfer etwa so getVSandEV(url).

Nach dem Definieren der Hilfsfunktionen, beginnt meine tatsächlichen Automatisierung:

try:
  print '\nBegin IronPython Request-Response testing'
  url = 'http://localhost/MiniCalc/Default.aspx'
  print '\nURL under test = ' + url + '\n'
  testCases = 'testCases.txt'
  ...

Im Gegensatz zu einigen Sprachen, die einen Einstiegspunkt, z. B. eine Main-Methode beginnt die Python-Skriptausführung einfach mit der ersten ausführbaren Anweisung. Ich Try-Schlüsselwort verwenden, um alle Ausnahmen abzufangen und dann eine Startmeldung drucken. Python ermöglicht die Verwendung von einfachen Anführungszeichen oder doppelte Anführungszeichen, um Zeichenfolgenliterale zu definieren und Escape-Sequenzen wie z. B. \n können mit beiden Trennzeichen eingebettet werden. Auswertung der Escape-Sequenz deaktivieren möchten, können Sie Zeichenfolgenliterale mit Kleinbuchstaben R (“ raw ”), z. B. voranstellen: Datei r'\newFile.txt = '. Ich hartcodieren der URL der Anwendung testen und den Wert der Shell angezeigt. Ich wollte den URL aus einer Befehlszeile gelesen, konnte ich das Array integrierte sys.argv z. B. verwendet haben: URL = sys.argv[1]. Python verwendet das “ + ” Zeichen für die Zeichenfolgenverkettung. Ich auch hartcodieren der Namen Test case-Datendatei, und da ich Datei Pfadinformationen nicht hinzufügen, da ich sicherstellen, dass der Annahme aus, die die Datei in demselben Verzeichnis wie die IronPython-Skript.

Als Nächstes richten Sie Leistungsindikatoren, meinen Testfall-Datendatei öffnen und starten Sie die Datei durchlaufen:

... 
numPass = numFail = 0
fin = open(testCases, 'r')
for line in fin:
  print '==========================================='
  (caseid,value1,value2,operation,decimals,action,expected) = 
    line.split('|')
  ...

Python hat mehrere Ausdrücke, die wirklich, die einschließlich mehrerer Variablenzuweisungen und präzise Operationen-Dateisyntax mir gefällt. Das Argument “ R ” im Aufruf der open-Funktion bedeutet, dass die Datei zum Lesen zu öffnen. Die Anweisung “ für die Zeilen im Fin ” zählt mithilfe der Datei eine Zeile zu einem Zeitpunkt Zuweisen von die aktuelle Zeile von Eingabedaten Variablen “ Zeile ”. Eine weitere praktische Python-Konstrukt ist das Tupel Ausdrucksweise. Tupel werden mithilfe von links gekennzeichnet und Tupel Werte und rechten Klammern durch getrennten “ ” Zeichen. Hier, rufe ich die Split-Methode, und weisen Sie jeden resultierenden token zu Variablen Caseid, value1, value2, Operation, Dezimalstellen, Aktion und erwartet, alle in einer einzigen Anweisung. Sehr schön.

Danach beginnen ich die Daten an die Webanwendung im Test zu erstellen:

... 
expected = 'value="' + expected.Trim() + '" id="TextBox3"'
data = 'TextBox1=' + value1 + '&TextBox2=' + value2 + '&Operation=' +
 operation + '&DropDownList1=' + decimals + '&Button1=' + action
print 'Test case: ' + caseid
print 'Input    : ' + data
print 'Expected : ' + expected
...

Ich ändern etwas Sie die erwartete Variable in etwa wie folgt aussehen:

value="5.7900" id="TextBox3"

Damit bei der Suche der HTTP-Antwort ich genauer als einfach “ 5.7900. ” gesucht werden Ich meinen Testfall Eingabewerte auf Ihre jeweiligen Steuerelemente als Name / Wert-Paare durch verbundene Zuordnen der “ & ” Zeichen. Die ersten beiden Name / Wert-Paare der Zeichenfolge nach legen einfach TextBox1 und TextBox2, value1 und value2 aus den Testfalldaten. Das dritte Name-Wert-Paar (z. B. Operation = RadioButton1) ist, wie ich einen Benutzer ein RadioButton-Steuerelement in diesem Fall auswählen des Steuerelements simulieren, die Addition entspricht. Sie erraten haben möglicherweise falsch (wie ich ursprünglich), dass die Methode zum Festlegen des Optionsfelds wäre, verwenden Sie eine Syntax wie RadioButton1 = überprüft. Aber RadioButton1 ist ein Wert des Operation-Steuerelements nicht auf ein Steuerelement selbst. Das fünfte Name / Wert-Paar Button1 = geklickt haben, ist etwas irreführend. Muss ich eine Angabe für Button1, um anzugeben, dass das Steuerelement geklickt haben, aber jeder Wert wird arbeiten, so dass Button1 bereits verwendete konnte = Foo (oder sogar nur Button1 =) aber Button1 = geklickt aussagekräftigere meiner Meinung nach ist. Ich echo der Werte, die ich aus den Testfalldaten der Befehlsshell, wodurch Verwendung der Verkettungsoperator “ + ” Zeichenfolge analysiert haben.

Als Nächstes behandelt ich mit den ViewState und EventValidation:

... 
vs = getVS(url)
ev = getEV(url)
vs = HttpUtility.UrlEncode(vs)
ev = HttpUtility.UrlEncode(ev)
data = data + "&__VIEWSTATE=" + vs + "&__EVENTVALIDATION=" + ev
...

Ich nenne die zuvor definierten GetVS und GetEV Hilfsfunktionen. Die ViewState und EventValidation Werte sind Zeichenfolgen, Base64-codiert. Base64-Codierung verwendet 64 Zeichen: Großbuchstaben Sie A-Z, Kleinbuchstaben Sie a bis Z, Ziffern 0-9, die Zeichen “ + ” und das Zeichen “ / ”. Das “ = ” Zeichen wird in Base64 für Füllzeichen verwendet. Da einige in Base64 verwendeten Zeichen in Streams eine HTTP-Anforderung zulässig sind nicht, verwenden Sie die HttpUtility.UrlEncode-Methode aus der System.Web-Namespace problematische Zeichen in eine Folge von drei Zeichen beginnt mit dem “ % ” Zeichen zu konvertieren.

Beispielsweise eine unformatierte “ > ” Zeichen codiert ist als % 3D und ein Leerzeichen ist als codiert %20. Wenn ein Webserver eine HTTP-Anforderung enthält keines dieser speziellen drei Zeichenfolgen empfängt, wird der Server die Sequenzen auf Rohdaten decodiert. Fügen Sie nach der Codierung, ich ViewState und EventValidation Werte auf die Post-Daten an.

Anschließend bearbeiten Sie die Post-Daten für eine HTTP-Anforderung die Auslieferung:

...  
buffer = Encoding.ASCII.GetBytes(data)
req = HttpWebRequest.Create(url)
req.Method = 'POST'
req.ContentType = 'application/x-www-form-urlencoded'
req.ContentLength = buffer.Length
...

Ich verwende die GetBytes-Methode von der System.Text-Namespace, um meine Post-Daten in ein Byte-Array mit dem Namen Puffer zu konvertieren. Anschließend erstellen Sie ein neues HttpWebRequest-Objekt eine explizite Create-Methode verwenden. Ich Geben Sie Werte an die Methode, ContentType und ContentLength Eigenschaften des HttpWebRequest-Objekts. Sie können sich den Wert der ContentType als Zeichenfolge Magic vorstellen, die erforderlich sind, um eine Anforderung mit HTTP-Web zu buchen.

Dann senden Sie die HTTP-Anforderung:

... 
reqst = req.GetRequestStream()
reqst.Write(buffer, 0, buffer.Length)
reqst.Flush()
reqst.Close()
...

Das Programmieren Muster für das Senden einer Anforderung mag etwas ungerade, wenn Sie mit dem Verfahren vertraut. Anstatt eine explizite Send-Methode Art zu verwenden, erstellen ein Stream-Objekt und verwenden Sie die Write-Methode.

Die Write-Methode erfordert ein Byte-Array der Index im Array zu schreiben und die Anzahl der zu schreibenden Bytes an. Mithilfe von 0 und buffer.Length schreiben ich alle Bytes im Puffer. Write-Methode nicht tatsächlich die Post an den Webserver senden; Sie müssen einen Sende-erzwingen, indem Sie die Flush-Methode aufrufen. Die Close-Methode ruft die Flush-Methode so, dass meine Aufruf von Flush ist nicht in diesem Fall erforderlich, aber ich den Anruf aus Gründen der Übersichtlichkeit enthalten.

Nach dem Senden der HTTP-Anforderung, rufen die zugeordnete Antwort ab:

... 
res = req.GetResponse()
resst = res.GetResponseStream()
sr = StreamReader(resst)
html = sr.ReadToEnd()
sr.Close()
resst.Close()
...

Die GetResponse-Methode gibt eine HttpWebRequest-Objekt zugeordnete HttpWebResponse-Objekt zurück. Das Antwortobjekt kann verwendet werden, um einen Stream zu erstellen, und dann I Stream StreamReader-Objekt zuordnen und ReadToEnd-Methode verwenden, um den gesamten Antwortstream als einzelne Zeichenfolge abzurufen. Obwohl die zugrunde liegenden .NET Framework-Bereinigung Mechanismen für Sie schließlich StreamReader und Stream-Objekten schließen würde, bevorzuge ich diese explizit zu schließen.

Anschließend untersuchen Sie die HTTP-Antwort für den Testfall Erwarteter Wert:

... 
if html.IndexOf(expected) >= 0:
  print 'Pass'
  numPass = numPass + 1
else:
  print '**FAIL**'
  numFail = numFail + 1
...

Ich verwende die IndexOf-Methode, um die HTTP-Antwort zu suchen. Da IndexOf an der Anfang der Suchzeichenfolge in der Referenz-Zeichenfolge ein Rückgabewert zurückgibt > = 0 bedeutet, dass die Suchzeichenfolge, die in der Referenz-Zeichenfolge ist. Beachten Sie, dass im Gegensatz zu vielen Sprachen Python inkrementieren bzw. z. B.-Dekrementoperatoren ++ NumPass.

Dann beenden Sie das Skript:

... 
    print '===============================\n'
    # end main processing loop
  fin.close()
  print '\nNumber pass = ' + str(numPass)
  print 'Number fail = ' + str(numFail)  
  print '\nEnd test run\n'
except:
  print 'Fatal: ', sys.exc_info()[0]
# end script

Ich setzen einen Kommentar am Ende der Schleife “ für ”, die jede Zeile in der Datendatei Testfall durchlaufen, als Hilfestellung beim sicherstellen, dass meine Einzug korrekt ist. Einmal außerhalb der Schleife kann ich Testfall-Datendatei schließen und Drucken der Durchgang und Leistungsindikatoren fehl. Beachten Sie, dass da NumPass und NumFail abgeleitet wurden, werden der Typ Int I umwandeln müssen Sie “ Zeichenfolge ” Python str-Funktion verwenden, damit ich Sie verketten können. Meine Testumgebung wird beendet, indem die Behandlung von Ausnahmen im Try-Block ausgelöst, einfach durch Drucken der generischen Ausnahmemeldung im integrierten sys.exec_info-Array gespeichert.

Schnelle Automatisierung mit einer kurzen Lebensdauer

Das ich hier dargestellten Beispiel sollten Sie genügend Informationen zum Schreiben von IronPython-Testautomatisierung für Web-Anwendungen geben. Es gibt mehrere Alternativen zur Verwendung von IronPython. Meiner Meinung nach ist IronPython sich am besten für einfache Testautomatisierungen, in dem Sie schnell die Automatisierung erstellen möchten, und die Automatisierung hat eine beabsichtigte Lebensdauer von kurzen (ein paar Tage oder Wochen). Meine Technik hat einige Einschränkungen – insbesondere kann nicht es problemlos Umgang mit Webanwendungen, die Popup-Dialogfeldern zu generieren.

Im Vergleich mit anderen Skriptsprachen, ist einer der Vorteile der Verwendung von IronPython für einfache Testautomatisierungen, dass Sie die interaktive Konsole Problem Befehle verwenden können, damit Ihr Skript schreiben. Darüber hinaus sind einige nützliche Editoren verfügbar, und finden Sie auch IronPython-SDKs Sie Iron ­ Python in Visual Studio integrieren lassen. Persönlich beim ich werde Testautomatisierung für Web-Anwendung, zu schreiben, wenn eine relativ kurze Testumgebung entwickelt werden soll, sollte ich IronPython und Editor. Wenn ich eine Testumgebung zu schreiben werde, mehr als drei Seiten des Codes ist, verwenden jedoch ich im Allgemeinen C#- und Visual Studio.

Dr.James McCaffrey  arbeitet für Volt Information Sciences Inc., wo er verwaltet die technische Schulungen für Softwareentwickler bei Microsoft Redmond, Washington, Campus. Er hat an verschiedenen Microsoft-Produkten mitgearbeitet, unter anderem an Internet Explorer und MSN Search. McCaffrey ist der Autor von “ .NET Test Automation Recipes: Ein Problem Projektmappen-Ansatz ” (Apress, 2006). Er kann unter jammc@microsoft.com-erreicht werden.

Dank an den folgenden technischen Experten für die Überprüfung dieser Artikel: Dave Fugate and Paul Newson