TEAM PROJECT测试报告以及讨论
本博客分四个部分:
第一部分是学习test automation理论之后的感想;
第二部分是如何学习了基本的测试工具HttpUnit;
第三部分是主要的测试报告,分为注册登录测试和水果购物功能测试,其中包括代码和截屏;
最后,第四部分是测试的总结和讨论。
1. Understanding the test automation
阅读http://en.wikipedia.org/wiki/Automated_testing#Graphical_User_Interface_.28GUI.29_testing: test automation的好处在于重复性的测试工作能很高效地完成。测试中有很多工作是重复性的,随着版本更新,几乎一样的测试需要重新完成一次。所以,如果将这些工作用代码实现,那么这些重复性的工作就能很省时省力地完成。我们组的项目比较适合在Test automation 中的 GUI Test。GUI Test需要模拟用户的行为来操作产品的图形界面。
2. 学习了测试工具HttpUnit
HttpUnit让测试者可以通过Java类和服务器进行交互。HttpUnit的WebConversation类可以模拟浏览器对网页进行的各种行为,并让用户查看反馈信息。我们组选择使用HttpUnit的原因是HttpUnit主要针对的是网站GUI的正确性,而这正是我们的水果网站所主要需要测试的。我们需要用各种各样变化的输入来对页面的反馈进行监测,而HttpUnit可以很轻松地完成这些工作。在基本学习了HttpUnit的各种操作之后,我安装了HttpUnit 1.7 release (http://prdownloads.sourceforge.net/httpunit/httpunit-1.7.zip?download)
一个简单的使用HttpUnit抓取网页的程序如下:
import java.io.IOException;
import org.xml.sax.SAXException;
import com.meterware.httpunit.*;
public class Test {
public static void main(String[] args) {
WebConversation browser = new WebConversation(); //建立一个新的模拟浏览器
WebResponse response = null; //建立一个空的网站反馈
try {
//将访问制定网址并将结果放在response中
response = browser.getResponse("http://59.66.140.197:8001/");
System.out.println(response.getText()); //将response中的网页源码打印出来
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}}}
3. 测试报告
我们组的测试主要是用HTTPUnit进行GUI test。测试报告分两部分,注册和登录测试,以及水果选购功能的测试。为保证两个测试的效果不会互相影响,这两项测试是分开进行的,为此,水果选购功能是在匿名登录的情况下测试的。为篇幅起见,这里的代码只是主要功能段的代码,次要部分一律省略。
3.1 注册和登录测试
注册和登录功能的测试主要测试两个方面,
3.1.1 测试网站的注册功能是否能防止相同用户名的重复注册。
方法是,用一个新的用户名进行注册,并且成功。然后用相同的用户名在进行注册,看是否还是会失败。
代码:
public static void main(String[] args) throws Exception{
WebConversation browser = new WebConversation();
WebRequest requestLogin = new GetMethodWebRequest("http://59.66.140.197:8001/accounts/register/");
WebResponse responseLogin = browser.getResponse(requestLogin);
WebForm form = responseLogin.getForms()[0];
for (int i = 0; i < 10; i++){
String username = "testnewcomer";
form.setParameter("username", username); //用户名一直用“testnewcomer”
form.setParameter("email", username + "@gmail.com");
form.setParameter("password1", "password");
form.setParameter("password2", "password");
requestLogin = form.getRequest(); //用相同的用户名进行登录
responseLogin = browser.getResponse(requestLogin);
System.out.println(responseLogin.getText());
System.out.println("======================");
}
}
反馈信息在控制台中显示,截图如下:
结论:网站注册功能可以防止相同的用户名重复注册。
3.1.2 注册功能是否会防止过于简单的密码
我们希望网站在用户注册时如果用全数字的密码,则不能通过。方法是随机生成一个1-6位的数字密码,同时我们在注册时用了不同的用户名。
代码如下:
public static void main(String[] args) throws Exception{
WebConversation browser = new WebConversation();
WebRequest requestLogin = new GetMethodWebRequest("http://59.66.140.197:8001/accounts/register/");
WebResponse responseLogin = browser.getResponse(requestLogin);
WebForm form = responseLogin.getForms()[0];
for (int i = 0; i < 10; i++){
String username = i + "testnewcomer";
form.setParameter("username", username);
form.setParameter("email", username + "@gmail.com");
Random r = new Random();
String password = String.valueOf(r.nextInt(10000000)); //随机生成一个1-6位的数字密码
form.setParameter("password1", password);
form.setParameter("password2", password);
requestLogin = form.getRequest();
responseLogin = browser.getResponse(requestLogin);
System.out.println(responseLogin.getText());
System.out.println("======================");
}
}
测试结果的截屏如下
结论:网站现在还不能检测简单密码,防止这样的注册。这是进一步的工作。
3.2 水果选购功能测试
我们希望选购功能可以成功记录用户所选的水果,极其数量,并测试网站是否可以正确反馈。
首先,我将选购页面中可以设置的控件都打印出来,并且将空表提交后的反馈页面中的信息也反馈出来。showAllForms(WebConversation browser, WebRequest request)函数将request反馈的信息中所有的控件都显示出来。showAllBlocks(WebConversation browser, WebRequest request)函数将request反馈的信息中所有的文字信息都显示出来。
代码如下,
public static void main(String[] args){
WebConversation browser = new WebConversation();
WebRequest requestBuylist = new GetMethodWebRequest(
"http://59.66.140.197:8001/buylist/");
try {
WebResponse responseBuylist = browser.getResponse(requestBuylist);
showAllForms(browser, requestBuylist);
WebForm[] webForms = responseBuylist.getForms();
WebForm form = webForms[0];
requestBuylist = form.getRequest();
showAllBlocks(browser, requestBuylist);
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public static void showAllBlocks(WebConversation browser, WebRequest request) throws IOException, SAXException{
WebResponse responseBuylist = browser.getResponse(request);
//获得文字模块对象
TextBlock[] textBlocks = responseBuylist.getTextBlocks();
for (int k = 0; k < textBlocks.length; k++){
System.out.println("第"+k+"个textblock是"+textBlocks[k].getText());
}
}
public static void showAllForms(WebConversation browser,
WebRequest request) throws IOException, SAXException{
WebResponse responseBuylist = browser.getResponse(request);
System.out.println(responseBuylist.getText());
//获得表单对象
WebForm[] webForms = responseBuylist.getForms();
for (int k = 0; k < webForms.length; k++){
System.out.println("第" + k + "张表单:");
//获得第k张表单中所有控件的名字
String[] pNames = webForms[k].getParameterNames();
//循环显示第k张表单中所有控件的内容
for (int i = 0; i < pNames.length; i++){
System.out.println("第"+(i+1)+"个控件的名字是"+pNames[i]+",里面的内容是"
+webForms[k].getParameterValue(pNames[i]));
}
}
}
结果的截屏如下:
之后,我用不同的对不同的水果的变量名进行赋值,并且看反馈结果。
代码如下,
static int passCount = 0;
public static void main(String[] args) throws IOException, SAXException{
WebConversation browser = new WebConversation();
WebRequest requestBuylist = new GetMethodWebRequest(
"http://59.66.140.197:8001/buylist/");
for (int i = 0; i < 100; i++){
System.out.println("第" + i +"次测试");
testShopping(browser, requestBuylist);
}
System.out.println("测试次数:100");
System.out.println("通过次数:" + passCount);
}
public static void testShopping(WebConversation browser,
WebRequest requestBuylist) throws IOException, SAXException{
WebResponse responseBuylist = browser.getResponse(requestBuylist);
WebForm[] webForms = responseBuylist.getForms();
WebForm form = webForms[0];
Random r = new Random();
double price = 0;
int[] numberList = new int[11];
for (int i = 1; i <= 10; i++){
numberList[i] = r.nextInt(5); //对每种水果,随机选购一定数量
form.setParameter("number" + i,
String.valueOf(numberList[i]));
price += uprice[i-1]*numberList[i]; //实际价格
System.out.println("number" + i + " is " + numberList[i]);
}
requestBuylist = form.getRequest();
responseBuylist = browser.getResponse(requestBuylist);
String totalPrice = responseBuylist.getTextBlocks()[11].getText();
String[] contents = totalPrice.split(" ");
double responsePrice = Double.valueOf(contents[contents.length-1]); //网站反馈价格
System.out.println("实际价格"+price+",反馈价格"+responsePrice);
if (Math.abs(responsePrice-price) < 1){ //允许正负一元之间的误差
System.out.println("Pass!!");
passCount++;
}
}
测试结果截图
结论:网站的选购功能成功率百分之一百!
4. 讨论
通过学习test automation和尝试使用测试工具,本组完成了对网站基本功能功能性的测试。我们亲身体会了测试自动化所带来的好处。更重要的是,我们在测试中发现了一些问题,比如3.1.2中说的注册密码过于简单的情况无法防止。
存在的不足主要有两点。
1.没有系统地对需要测试的目标进行预先讨论。实际情况是,测试工具能够做哪些测试,我们就做哪些测试。比如水果网站对各种浏览器的兼容性就无法用HttpUnit测试工具完成。幸好,这个工作已经在alpha版本的测试中完成,而且由于所用的django架构直接决定了我们网站的兼容性,所以这个工作算是完成了。
2. 没有足够时间测试经过修复的代码。作为tester,我很希望能用同样的代码测试队友们改进的代码,但由于时间所限,新代码一直处在开发中,所以在本测试报告完成前还不能进行测试。
posted on 2011-05-30 13:28 banana.totolv 阅读(616) 评论(1) 编辑 收藏 举报