banana.totolv

导航

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编辑  收藏  举报