Este artículo proviene de un motor de traducción automática.
Ejecución de pruebas
Pruebas de solicitud y respuesta con IronPython
James McCaffrey
Descargar el ejemplo de código
Soy un ventilador grande de utilizar el lenguaje de programación Python para varios tipos de tareas de automatización de prueba ligera. En la columna de este mes, mostraré cómo utilizar IronPython, una implementación compatible con Microsoft .NET Framework de Python, para realizar las pruebas de aplicaciones ASP.NET Web de respuesta de solicitud HTTP.
En concreto, se crea una secuencia de comandos de instrumento de prueba breve que simula un usuario que utiliza una aplicación ASP.NET. Los cables de IronPython mediante programación registra la información de solicitud HTTP para la aplicación en un servidor Web. A continuación, recupera la secuencia de respuesta HTTP
y examina el texto HTML de un valor esperado de algún tipo para determinar un resultado correcto o incorrecto. También en un útil
las pruebas técnica derecho propio, aprender a realizar pruebas con IronPython de respuesta de solicitud HTTP son un medio excelente para obtener información sobre el lenguaje de IronPython.
Esta columna se supone que tiene familiaridad básica con la tecnología ASP.NET y intermedias de secuencias de comandos de conocimientos con un lenguaje como, por ejemplo, JavaScript, Windows PowerShell, VBScript, Perl, PHP o Ruby, pero me Don se supone que tiene experiencia con Python. Sin embargo, incluso si es nuevo en ASP.NET y las secuencias de comandos, aún podrá seguir la columna sin demasiada dificultad. La mejor opción para ver mi objetivo es examinar las capturas de pantalla en de las figuras 1 y 2 de .
La figura 1 se muestra en el ejemplo de aplicación Web de ASP.NET en la prueba. El sistema de prueba es un Web sencillo pero representativo
aplicación denominada MiniCalc. Me deliberadamente mantener mi aplicación sometida a prueba de Web de ASP.NET tan sencillo como sea posible para que los no oculte los puntos principales de la automatización de prueba de IronPython. Realistas de las aplicaciones Web son considerablemente más complejas que la aplicación MiniCalc ficticia que se muestra en de figura 1, pero la técnica de prueba de IronPython que describo aquí fácilmente generaliza para las aplicaciones complejas. La aplicación MiniCalc Web acepta dos valores numéricos, agregue o multiplique los valores y el número de decimales al mostrar la respuesta para la indicación. A continuación, la aplicación envía los valores en un servidor Web, donde se calcula el resultado. El servidor crea la respuesta HTML y lo envía al explorador cliente, donde el resultado se muestra el número de decimales especificado por el usuario.
Figura 1 de la aplicación de Web MiniCalc en prueba
La figura 2 muestra un instrumento de prueba de IronPython en acción. Mi secuencia de comandos se denomina harness.py y no acepta ningún argumento de línea de comandos. Por motivos de simplicidad, tengo la información incluida en el código, incluida la dirección URL de la aplicación Web y el nombre del archivo de entrada en caso de prueba. Mi agente comienza devolviendo la dirección URL de destino de http://localhost/MiniCalc/Default.aspx. En caso de prueba 001, mi agente mediante programación registra información que corresponde a un usuario escribe 1.23 en el control TextBox1, escribir 4.56 en TextBox2, seleccionando RadioButton1 (para indicar que una operación de suma), 4 de la selección desde el control DropDownList1 y haciendo clic en Button1 (para calcular). En segundo plano, la herramienta captura la respuesta HTTP desde el servidor Web y, a continuación, busca en la respuesta para indicar que 5.7900 (la suma correcta de decimales 1,23 y 4.56 a 4) se encuentra en el control de resultado TextBox3. El número de la prueba de las pistas de instrumento de los casos ese paso y el número que se produzca un error y muestra los resultados de una vez que se hayan procesado todos los casos de prueba.
La figura 2 de la prueba de la aplicación mediante IronPython
En las secciones siguientes, se describe brevemente la aplicación Web sometida a prueba para que sepas exactamente lo que se está probando. A continuación, describen los detalles de la creación de la automatización ligera de solicitud y respuesta HTTP utilizando IronPython. Envolver presentando unas opiniones acerca de cuándo es adecuado el uso de IronPython y cuándo son más apropiadas otras técnicas. Creo que encontrará la información de interés y una adición útil para el conjunto de herramientas de prueba.
La aplicación en la prueba
Let’s examine el código de la aplicación Web MiniCalc de ASP.NET, que es el destino de mi automatización de prueba. Se ha creado la aplicación mediante Visual Studio 2008. Después de iniciar Visual Studio con privilegios de administrador, hace clic en archivo | nuevo | sitio Web. Para evitar que el mecanismo de código subyacente ASP.NET y conservar todo el código de mi aplicación Web en un solo archivo, selecciona la opción de sitio Web vacío. Especifiqué http://localhost/MiniCalc en el campo de ubicación. Decidí usar C# para la aplicación MiniCalc, pero el instrumento de pruebas que estoy a presentar en obras de esta columna con las aplicaciones de ASP.NET que se escriben en VB.NET y con pequeñas modificaciones a que los cables pueden centrarse en aplicaciones Web escritas mediante tecnologías como, por ejemplo, ASP clásico, CGI, PHP, JSP y Ruby. Al hacer clic en Aceptar en el cuadro de diálogo nuevo sitio Web para generar la estructura de la aplicación Web. A continuación, pasó a la ventana del explorador de soluciones, right-clicked en el nombre del proyecto MiniCalc y selecciona Agregar nuevo elemento en el menú contextual. A continuación, he seleccionado Web Form desde la lista de las plantillas instaladas y acepta el nombre de archivo default.aspx. He desactivado la opción “ colocar el código en un archivo independiente ” y, a continuación, hace clic en el botón Agregar. A continuación, dicha en el nombre de archivo default.aspx en el Explorador de soluciones para modificar el código generado por la plantilla. He eliminado todo el código de plantilla y lo reemplaza con el código que se muestra en de figura 3.
La figura 3 del Código de MiniCalc
<%@ 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: </asp:Label>
<asp:TextBox id="TextBox1" width="100" runat="server" /></p>
<p><asp:Label id="Label2" runat="server">Enter another: </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:
<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>
Para mantener el código fuente de tamaño pequeño y fácil de entender, estoy teniendo los accesos directos como, por ejemplo, no efectuar la comprobación de errores y la combinación de controles de servidor (por ejemplo, < asp: TextBox >) con código HTML sin formato (por ejemplo, <fieldset>). Las partes más importantes del código en de figura 3 son los identificadores de los controles de servidor ASP.NET. Uso predeterminado de Label1 identificadores (solicitud de usuario), TextBox1 y TextBox2 (de entrada para los dos números), RadioButton1 y RadioButton2 (opción de suma o multiplicación), DropDownList1 (número de decimales para el resultado), Button1 (calcular) y TextBox3 (resultado). Para llevar a cabo HTTP petición-respuesta automática las pruebas de una aplicación ASP.NET mediante la técnica que presento aquí, debe conocer los identificadores de controles de la aplicación. En este caso, tengo el código fuente disponible debido a que voy a crear la aplicación de mí; pero incluso si se está probando una aplicación Web que es no escribir, siempre se puede examinar la aplicación mediante la funcionalidad de código fuente de la vista del explorador de Web.
Para comprobar que la aplicación Web sometida a prueba se ha creado correctamente, presionó la tecla de <F5>. Al hacer clic en Aceptar en el diálogo de depuración no habilitada resultante para indicar a Visual Studio para modificar el archivo Web.config de la aplicación Web. Visual Studio, a continuación, inicie Internet Explorer y carga MiniCalc. Tenga en cuenta que la acción del elemento de mi <form> está establecido a default.aspx. Es decir, cada vez que un usuario envía una solicitud, se ejecuta el mismo código de la página default.aspx. Esto proporciona a mi aplicación MiniCalc Web el funcionamiento de una aplicación en lugar de una secuencia de páginas de Web diferentes. Como HTTP es un protocolo sin estado, ASP.NET lo logra el efecto de la aplicación al mantener el estado de la aplicación Web en un tipo de valor oculto especial, denominado ViewState. Como verá en breve, tratamiento de ViewState de una aplicación de ASP.NET es una de las claves de datos a la aplicación de contabilización mediante programación.
Pruebas de IronPython para ASP.NET solicitud y respuesta
Let’s, repase el programa de instrumento de prueba de IronPython que produjo la captura de pantalla en de figura 2. IronPython es una descarga gratuita disponible de CodePlex, el proyecto de código abierto patrocinado por Microsoft, en ironpython.codeplex.com de . Estoy utilizando la versión 2.6.1, que se ejecuta en la versión 2.0 de .NET Framework y se ejecuta en cualquier equipo que sea compatible con esta versión de Framework. La estructura general de mi script de instrumento de prueba se presenta en de figura 4.
La figura 4 de estructura de instrumento de prueba
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
Como puede ver, mi secuencia de comandos del agente es sencillo y está controlada por un archivo de datos externos de casos de prueba. Ese archivo de datos de casos de prueba se denomina testCases.txt y consta de:
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
Cada línea representa un escenario de prueba y tiene siete de los campos delimitados por un “ | ” caracteres. El primer campo es un identificador de caso de prueba. Los campos del segundo y terceros son entradas TextBox1 y TextBox2. El cuarto campo codifica que solicita la adición o la multiplicación. El quinto campo es el valor para el control DropDownList de decimales. La sexta campos que se hizo clic (“ en ”) es el evento Button1. El campo séptimo es el resultado esperado, que debe aparecer en TextBox3. El segundo caso de prueba es deliberadamente incorrecto para demostrar un error en caso de prueba. Para el que estoy describiendo aquí el enfoque de prueba ligera, un archivo de texto simple para almacenar datos de los casos de prueba suele ser una buena opción. Si había quería incrustar los datos del caso de prueba directamente en la secuencia de comandos del agente, podría haber hecho utilice una matriz de cadenas como:
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']
y, a continuación, recorre en iteración cada caso de prueba como:
for line in testCases:
...
Python también tiene un tipo de lista que se puede utilizar para almacenar los datos de los casos de prueba.
Las tres primeras líneas de mi instrumento de prueba de IronPython son:
# harness.py
import sys
import clr
Los comentarios de Python comienzan con el carácter “ # ” y extienden al final de línea. La instrucción “ importar sys ” permite que la secuencia de comandos para tener acceso a recursos en el módulo especial de sys de IronPython.
Las ubicaciones de estos recursos se pueden enumerar emitiendo un comando sys.path desde la consola interactiva de IronPython. La instrucción “ importación clr ” permite mi secuencia de comandos tener acceso y utilizar la funcionalidad de .NET CLR principal.
Mis seis instrucciones habilitar explícitamente la funcionalidad de .NET que utiliza mi agente:
from System import *
from System.IO import *
from System.Text import *
from System.Net import *
clr.AddReference('System.Web')
from System.Web import *
La primera línea importa del sistema y es similar a la instrucción “ using System ” en un programa de C#. La instrucción “ importar clr ” incluye el espacio de nombres System, por lo que podría omitir la “ de importación del sistema * ” instrucción pero prefieren dejarla en que un formulario de documentación. Las tres instrucciones proporcionan la System.IO (para las operaciones de archivos), espacio de nombres System.Text (para la conversión de byte) y espacios de nombres System.NET (para la solicitud de funcionalidad de respuesta de ) en el ámbito. El “ clr.AddReference (‘ Sys tem.Web ’) ” instrucción incorpora el espacio de nombres System.Web en el ámbito. Este espacio de nombres no es directamente accesible de forma predeterminada, por lo que debe utilizar el método de AddReference antes de que emita el “ de importación de System.Web * ” instrucción, por lo que puedo obtener acceso a los métodos de codificación de la dirección URL.
A continuación, se define un método auxiliar para recuperar la información de ViewState de la aplicación Web sometida a prueba:
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
Recuerde que como HTTP es un protocolo sin estado, ASP.NET proporciona un efecto de que se va a una aplicación con estado, manteniendo el estado de la aplicación en un valor oculto que se llama a ViewState. Un valor de ViewState es una cadena codificada en Base64 que mantiene el estado de una página ASP.NET a través de varios de solicitud/respuesta de idas y vueltas. De forma similar, un valor de EventValidation se agregó en ASP.NET 2.0 y se utiliza por motivos de seguridad para ayudar a evitar los ataques de inserción de secuencias de comandos. Estos dos mecanismos son clave para enviar los datos una aplicación ASP.NET Web mediante programación.
En Python, debe definir las funciones antes de llamar a ellos en una secuencia de comandos. Las funciones se definen con la palabra clave de la definición. La función auxiliar primero crea una instancia de un objeto WebClient. A continuación, el método DownloadData envía una solicitud HTTP para la aplicación Web proporcionada por el parámetro url y recupera la respuesta HTTP como una matriz de valores de byte. Uso del método GetString que convierta los bytes en una cadena con el nombre de html. Un elemento ViewState tiene este aspecto:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwULLTEwNjU=" />
Por lo tanto, para extraer el valor, primero determinar la ubicación de los id de la subcadena = "__VIEWSTATE" y, a continuación, agregue 24 caracteres. Este enfoque es frágil en el sentido de que la técnica se romperá si ASP.NET se cambia el formato de la cadena de ViewState, pero debido a que se trata de la automatización ligera, simplicidad trumps solidez. Puedo determinar que es el carácter de comillas dobles y, a continuación, puedo utilizar el método substring para extraer el valor de ViewState. A diferencia de la mayoría de los idiomas, los símbolos (tokens) de uso como empezar... end {...} para delimitar los bloques de código, Python utiliza la sangría. Si tiene experiencia en programación Python, esto puede parecer extraño en primer lugar, pero la mayoría de los ingenieros que he hablado decir rápidamente se utiliza la sintaxis. Python es compatible con una colección de módulos, de forma alternativa al uso de métodos de .NET para recuperar el valor de ViewState es utilizar las funciones del módulo de urllib nativo de Python.
Después de definir la función auxiliar getVS, defino una función auxiliar para obtener el valor de 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
Utilizo la misma técnica para extraer EventValidation como para extraer el ViewState. Tenga en cuenta que Python es un lenguaje con tipos dinámicos, por lo que no se especifica los tipos de datos de parámetros, variables y objetos. Por ejemplo, DownloadData devuelve una matriz de bytes IndexOf devuelve un tipo int y el intérprete de IronPython averiguar estos tipos para mí. Define dos funciones, getVS y getEV, requiere dos llamadas de ida y vuelta a la aplicación Web sometida a prueba, por lo que desea combinar las dos funciones en una sola función y el nombre de la rutina auxiliar como getVSandEV(url).
Después de definir las funciones de aplicación auxiliar, mi automatización real comienza:
try:
print '\nBegin IronPython Request-Response testing'
url = 'http://localhost/MiniCalc/Default.aspx'
print '\nURL under test = ' + url + '\n'
testCases = 'testCases.txt'
...
A diferencia de algunos idiomas que requieren un punto de entrada, como, por ejemplo, un método Main, ejecución de secuencias de comandos de Python simplemente comienza con la primera instrucción ejecutable. Utilizar la palabra clave try para detectar las excepciones, a continuación, se imprime un mensaje de inicio. Python permite el uso de comillas simples o comillas dobles para definir los literales de cadena y se pueden incrustar secuencias de escape, como \n con cualquier tipo de delimitador. Para desactivar la evaluación de la secuencia de escape, se pueden anteponer literales de cadena con minúscula r (“ raw ”), por ejemplo: archivo = r'\newFile.txt '. I en el código la dirección URL de la aplicación sometida a prueba y mostrar dicho valor para el shell. Si se deseaba leer de la dirección URL de la línea de comandos, podría haber usado la matriz sys.argv integrados, por ejemplo: URL = sys.argv[1]. Python, utiliza el carácter de “ + ” para la concatenación de cadenas. Yo también en el código el nombre de mi prueba caso el archivo de datos y, debido a no se incluye información de ruta de acceso de archivos, hago la suposición de que el archivo se encuentra en el mismo directorio que la secuencia de comandos de IronPython.
A continuación, I configurar los contadores, abra el archivo de datos de casos de prueba y empezar a recorrer en iteración el archivo:
...
numPass = numFail = 0
fin = open(testCases, 'r')
for line in fin:
print '==========================================='
(caseid,value1,value2,operation,decimals,action,expected) =
line.split('|')
...
Python tiene varios lenguajes, que me encanta, incluida la asignación de variables y sintaxis de las operaciones de archivo concisa de varios. Significa que el argumento “ r ” en la llamada a la función abrir para abrir el archivo para lectura. La instrucción “ de línea en fin ” recorre el archivo de una línea a la vez, la asignación de la línea actual de la entrada de variable “ línea ”. Otra nueva construcción de Python es la expresión de tupla. Las tuplas se indican mediante izquierda y el paréntesis y los valores de la tupla están delimitadas por “, ” caracteres. A continuación, llamo el método split y asigne cada resultado de símbolo (token) para las variables caseid, valor1, valor2, operación, decimales, acción y espera, todo ello en una única instrucción. Muy descriptivo.
A continuación, empezar a generar los datos a la aplicación Web sometida a prueba:
...
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
...
Modificar ligeramente la variable esperada para parecerse a algo como:
value="5.7900" id="TextBox3"
Por lo tanto, al buscar la respuesta HTTP, le sea más específico que simplemente buscando “ 5.7900. ” Asociar los valores de entrada de casos de prueba a sus respectivos controles como pares de nombre y valor conectados a través de la “ & ” caracteres. Los primero de dos pares de nombre / valor de la cadena de entrada establecen simplemente TextBox1 y TextBox2 a valor1 y valor2 de los datos de casos de prueba. El tercer par de nombre y valor (por ejemplo, operación = RadioButton1) es cómo simular un usuario selecciona un control RadioButton, en este caso, el control que se corresponde con la adición. Adivinado incorrectamente (como hice originalmente) que la forma de establecer el botón de opción sería utilizar una sintaxis como RadioButton1 = activado. Pero RadioButton1 es un valor del control de la operación, no un control en Sí. El quinto par nombre-valor, Button1 = hace clic en él, es un poco confuso. Se necesita para proporcionar un valor de Button1 indicar que ha hecho clic en el control, pero cualquier valor va de trabajo, por lo que podría ha utilizado Button1 = foo (o incluso simplemente Button1 =), pero Button1 = hace clic en él es más descriptivo, en mi opinión. Muestra en pantalla los valores que se he analizado desde los datos de casos de prueba al shell de comandos, utilizando el operador de concatenación de cadenas “ + ”.
A continuación, tratar con los valores de ViewState y EventValidation:
...
vs = getVS(url)
ev = getEV(url)
vs = HttpUtility.UrlEncode(vs)
ev = HttpUtility.UrlEncode(ev)
data = data + "&__VIEWSTATE=" + vs + "&__EVENTVALIDATION=" + ev
...
Llama a las funciones auxiliares getVS y getEV definidas anteriormente. Los valores de ViewState y EventValidation son cadenas codificadas en Base64. Codificación base 64 utiliza los 64 caracteres: a Z de mayúsculas, minúsculas a-z, números 0-9, el carácter “ + ” y el carácter “ / ”. Se utiliza el carácter de “ = ” en base 64 para relleno. Debido a que algunos de los caracteres utilizados en base 64 no están permitidos en una secuencia de solicitud HTTP, uso el método HttpUtility.UrlEncode del espacio de nombres System.Web para convertir caracteres problemáticos en una secuencia de tres caracteres que empieza con el carácter “ % ”.
Por ejemplo, un raw “ > ” carácter se codifica como % 3D y un espacio en blanco se codifican como % 20. Cuando un servidor Web recibe una solicitud HTTP que contengan cualquiera de estas secuencias de tres caracteres especiales, el servidor descodifica las secuencias de volver a la entrada sin formato. Después de la codificación, anexan los valores de ViewState y EventValidation a los datos de correo.
A continuación, procesar los datos de correo para prepararlo para una solicitud HTTP:
...
buffer = Encoding.ASCII.GetBytes(data)
req = HttpWebRequest.Create(url)
req.Method = 'POST'
req.ContentType = 'application/x-www-form-urlencoded'
req.ContentLength = buffer.Length
...
Utilizar el método GetBytes de espacio de nombres System.Text para convertir los datos Post en una matriz de bytes con el nombre de búfer. A continuación, creo un nuevo objeto HttpWebRequest utilizando el método Create explícito. Proporcionan valores a las propiedades del método, ContentType y ContentLength del objeto HttpWebRequest. El valor de ContentType se puede considerar como una cadena mágica que es necesaria para registrar una solicitud HTTP Web.
A continuación, envíe la solicitud HTTP:
...
reqst = req.GetRequestStream()
reqst.Write(buffer, 0, buffer.Length)
reqst.Flush()
reqst.Close()
...
El modelo de programación para enviar una solicitud puede parecer un poco extraño si está familiarizado con la técnica. En lugar de utilizar un método de envío explícito de algún tipo, se crea un objeto Stream y, a continuación, utilice un método de escritura.
El método de escritura requiere una matriz de bytes, el índice de la matriz para comenzar la escritura y el número de bytes que se escriben. Si utiliza 0 y buffer.Length, escribo todos los bytes del búfer. El método Write no enviar el correo al servidor Web, debe hacer un envío mediante una llamada al método Flush. En realidad, el método Close llama al método Flush, por lo que no es necesaria la llamada a Flush en esta situación, pero incluye la llamada por razones de claridad.
Después de enviar la solicitud HTTP, obtener la respuesta asociada:
...
res = req.GetResponse()
resst = res.GetResponseStream()
sr = StreamReader(resst)
html = sr.ReadToEnd()
sr.Close()
resst.Close()
...
El método GetResponse devuelve el objeto HttpWebResponse asociado a un objeto HttpWebRequest. El objeto de respuesta se puede utilizar para crear un objeto Stream y, a continuación, asocia el objeto Stream a un objeto StreamReader y utilice el método ReadToEnd para recuperar la secuencia de respuesta completa como una sola cadena. Aunque los mecanismos de limpieza de .NET Framework subyacentes finalmente podrían cerrar los objetos de StreamReader y Stream para usted, prefiero cerrarlos de forma explícita.
A continuación, examinar la respuesta HTTP para el valor esperado de casos de prueba:
...
if html.IndexOf(expected) >= 0:
print 'Pass'
numPass = numPass + 1
else:
print '**FAIL**'
numFail = numFail + 1
...
Utiliza el método IndexOf para buscar la respuesta HTTP. Debido a IndexOf devuelve la ubicación del principio de la cadena de búsqueda de la cadena de referencia y un valor > = 0 significa que la cadena de búsqueda que se encuentra en la cadena de referencia. Tenga en cuenta que, a diferencia de muchos lenguajes posibles, Python no dispone de incremento o como operadores de decremento ++ numPass.
A continuación, termine la secuencia de comandos:
...
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 scrip
Coloca un comentario al final del “ ” bucle que recorre en iteración cada línea del archivo de datos de casos de prueba como ayuda para asegurarse de que la sangría es correcta. Una vez fuera del bucle, puedo cerrar el archivo de datos de casos de prueba y la fase de impresión y producirá un error en los contadores. Tenga en cuenta que como numPass y numFail se infieren para ser de tipo int, deberán convertir para que escriba la cadena de “ ” utilizando la función str de Python, por lo que puedo concatenarlas. Mi agente termina controlando las excepciones producidas en el bloque try simplemente al imprimir el mensaje de excepción genérica almacenado en la matriz sys.exec_info integrados.
Rápida automatización con un corto período de duración
En el ejemplo que presenté aquí debe proporcionar suficiente información para escribir la automatización de prueba de IronPython para sus propias aplicaciones Web. Hay varias alternativas al uso de IronPython. En mi opinión, IronPython es más adecuado para la automatización de prueba ligera donde desea crear con rapidez de la automatización y la automatización tiene un período de duración prevista de poco (unos cuantos días o semanas). La técnica tiene algunas limitaciones, en particular no se puede tratar fácilmente con aplicaciones Web que generan los cuadros de diálogo emergente.
En comparación con otros lenguajes de secuencias de comandos, es una de las ventajas del uso de IronPython para la automatización de prueba ligera que puede utilizar la consola interactiva para ejecutar comandos para ayudarle a escribir la secuencia de comandos. Además, existen varios editores agradable y aún puede encontrar los SDK de IronPython que le permite integrar de Iron Python en Visual Studio. Personalmente, cuando voy a escribir la automatización de prueba de aplicaciones Web, si es necesario desarrollar un entorno relativamente corto, considere el uso de IronPython y el Bloc de notas. Si, voy a escribir un instrumento de que tiene más de tres páginas de código, sin embargo, por lo general, uso de C# y Visual Studio.
Dr.James McCaffrey en Volt Information Sciences Inc., donde encarga de formación técnica para los ingenieros de software que trabaja en el Microsoft Redmond, Washington, campus. Ha trabajado en varios productos de Microsoft, como Internet Explorer y MSN Search. McCaffrey es el autor de “ .NET Test Automation Recipes: Un enfoque de la solución de problemas ” (Apress, 2006). He can be reached at jammc@microsoft.com.
Gracias a los siguientes expertos técnicos de este artículo: Dave Fugate y Paul Newson