循环
当 Web 测试必须循环以发出在测试中动态确定的大量请求时,进行 Web 测试的编码。
以下示例对这一点进行演示,其中 Web 测试执行搜索,然后在搜索结果中连接每个链接。
using System; using System.Collections.Generic; using System.Text; using Microsoft.VisualStudio.TestTools.WebTesting; public class LoopingCoded : WebTest { public LoopingCoded() { } public override IEnumerator GetRequestEnumerator() { // Issue a search for the term "Microsoft" WebTestRequest request7 = new WebTestRequest("http://testserver/website/Search.aspx"); request7.ThinkTime = 20; request7.Method = "POST"; FormPostHttpBody request7Body = new FormPostHttpBody(); request7Body.FormPostParameters.Add("txtSearch", "Microsoft"); request7.Body = request7Body; yield return request7; // Loop through each anchor tag in the search result and issue a request to each tag's target url (href) foreach (HtmlTag tag in this.LastResponse.HtmlDocument.GetFilteredHtmlTags("a")) { WebTestRequest loopRequest = new WebTestRequest(tag.GetAttributeValueAsString("href")); yield return loopRequest; } } }
细粒度的事件处理
当只想将 PreRequest 和 PostRequest 事件处理程序应用于特定请求时,进行 Web 测试的编码。正常的 Web 测试将 WebTestRequestPlugins(处理这两种事件)应用于 Web 测试中的所有请求。
以下示例对这一点进行演示,其中 Web 测试将两个请求的响应体记录到磁盘,以用于调试和基准调整。
using System; using System.Collections.Generic; using System.IO; using System.Text; using Microsoft.VisualStudio.TestTools.WebTesting; public class EventHandlingCoded : WebTest { public EventHandlingCoded() { } public override IEnumerator GetRequestEnumerator() { WebTestRequest request1 = new WebTestRequest("http://testserver/website"); request1.ThinkTime = 8; yield return request1; // Log this response out to a file WebTestRequest request2 = new WebTestRequest("http://testserver/website/products.aspx"); request2.ThinkTime = 2; request2.QueryStringParameters.Add("CategoryID", "14", false, false); request2.PostRequest += new EventHandler(request2_PostRequest); yield return request2; WebTestRequest request3 = new WebTestRequest("http://testserver/website/products.aspx"); request3.ThinkTime = 2; request3.QueryStringParameters.Add("CategoryID", "15", false, false); yield return request3; // Log this response out to a file, too WebTestRequest request4 = new WebTestRequest("http://testserver/website/products.aspx"); request4.ThinkTime = 1; request4.QueryStringParameters.Add("CategoryID", "20", false, false); request4.PostRequest += new EventHandler(request4_PostRequest); yield return request4; } void request2_PostRequest(object sender, PostRequestEventArgs e) { File.WriteAllBytes("c:\\request2.html", e.Response.BodyBytes); } void request4_PostRequest(object sender, PostRequestEventArgs e) { File.WriteAllBytes("c:\\request4.html", e.Response.BodyBytes); } }
使用编码的 Web 测试模拟 Web JavaScript
如前所述,Web 测试引擎工作在 HTTP 层并且不运行 JavaScript。以影响 HTTP 层的方式依赖于 JavaScript 的 Web 站点,可使用编码的 Web 测试模拟通常由 JavaScript 执行的逻辑。
以下代码是一个简单的 Web 页,它收集电话号码,并在窗体提交时使用 JavaScript 除去一些非数字字符。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html > <head> <title>Untitled Page</title> <script type="text/javascript"> //get rid of some common non-digit characters // in the phone number string function FixPhoneNumber() { var phoneNumberElement = document.getElementById('phoneNumber'); var number = phoneNumberElement.value; number = number.replace('-', ''); number = number.replace('(', ''); number = number.replace(')', ''); number = number.replace(' ', ''); phoneNumberElement.value = number; return true; } </script> </head> <body> <form action="http://testserver/testwebsite/showparameters.aspx" method="post"> <div> <input name="phoneNumber" id="phoneNumber" type="text"/> <input name="submit" type="submit" value="Submit" onclick="FixPhoneNumber()" /> </div> </form> </body> </html>
当使用具有 phoneNumber 字段的数据绑定测试这种页时,可能会产生问题。如果数据源以不正确的格式包含电话号码,则非预期的数据将提交到服务器,从而导致 Web 测试失败。理想情况是:服务器在禁用 JavaScript 的情况下验证并修复数据,但是可能仍然需要 Web 测试来模拟客户端脚本运行。
在多数情况下,编码的 Web 测试可以轻松模拟影响 HTTP 请求的 JavaScript。以下示例演示如何模拟上面的 JavaScript。
public override IEnumerator GetRequestEnumerator() { WebTestRequest request1 = new WebTestRequest("http://testserver/testwebsite/default.aspx"); yield return request1; WebTestRequest request2 = new WebTestRequest("http://testserver/testwebsite/showparameters.aspx"); request2.Method = "POST"; FormPostHttpBody request2Body = new FormPostHttpBody(); //get the databound phone number from the context and // strip out certain characters to simulate JavaScript string phoneNumber = this.Context["PhoneNumber"].ToString(); phoneNumber = phoneNumber.Replace("-", ""); phoneNumber = phoneNumber.Replace("(", ""); phoneNumber = phoneNumber.Replace(")", ""); phoneNumber = phoneNumber.Replace(" ", ""); request2Body.FormPostParameters.Add("phoneNumber", phoneNumber); request2Body.FormPostParameters.Add("submit", "Submit"); request2.Body = request2Body; yield return request2; }
运行并调试编码的 Web 测试
要运行编码的 Web 测试,请在 Test View 或 Test Manager 窗口中选择该测试,并单击 Run 工具栏按钮。当编码的 Web 测试开始运行之后,可双击 Test Results 窗口以显示 Web Test Viewer。同样的功能可用于验证:编码的 Web 测试对于正常的 Web 测试而言是正确的。
由于 Web 测试与 Visual Studio 集成,因此可通过选择 Debug instead of Run 调试一个编码的 Web 测试,如以下屏幕快照所示。可在编码的 Web 测试中的任何位置设置断点,并且所有的标准调试机制均可用。
小结
对于如何在 Visual Studio 2005 Team Edition for Testers 中创建、验证并调试 Web 测试,希望您现在已经有了更好的了解。有关附加信息和支持资源,请参阅 Web 测试联机文档、我的网络日记以及我们组的 MSDN 支持论坛。