实验五 单元测试

实验五 单元测试

一、实验目的

1)掌握单元测试的方法

2)学习XUnit测试原理及框架;

3)掌握使用测试框架进行单元测试的方法和过程。

二、实验内容

1、了解单元测试的原理与框架

2、结对编程的小组采用测试框架 对自己“结对编程”实验的程序模块(类)进行单元测试,提交单元测试报告

测试报告包括以下内容:

1)源码

2)测试用例设计 (结合单元测试的内容和模块功能设计测试用例)

3)选择的测试框架介绍、安装过程

4 )测试代码

5)测试结果与分析

3、push测试报告和测试代码到各自的github仓库

4、提交博客报告

实验内容

1)源码

Map.java

package LifeGame;


import java.util.Random;

public class Map {
    final static public int x=16;//设置地图初始大小
    final static public int y=16;
    public static Cell [][]initial() {
        Cell [][]cell=new Cell[x][y];
        for(int i=0;i<x;i++) {
            for(int j=0;j<y;j++) {
                cell[i][j]=new Cell();
                Random random=new Random();
                cell[i][j].setStatus(random.nextInt(2)); //随机初始化设置细胞状态             
            }
        }
        return cell;
    }   
    public static void getLiving(Cell [][]cell){
        for(int i=0;i<x;i++) {
            for(int j=0;j<y;j++) {
                int living=0;
                if(i>0&&j>0) living+=cell[i-1][j-1].getStatus();
                if(j>0) living+=cell[i][j-1].getStatus();
                if(i<x-1&&j>0) living+=cell[i+1][j-1].getStatus();
                if(i>0) living+=cell[i-1][j].getStatus();
                if(i<x-1) living+=cell[i+1][j].getStatus();
                if(i>0&&j<x-1) living+=cell[i-1][j+1].getStatus();
                if(j<x-1) living+=cell[i][j+1].getStatus();
                if(i<x-1&&j<x-1) living+=cell[i+1][j+1].getStatus();        
                cell[i][j].setLiving(living);//计算细胞周围八个格子的活细胞数目,特殊位置边界只计算地图内活细胞数目,地图外默认为死细胞
            }
        }
    }
    public static int update(Cell [][]cell){
        int count=0;
        for(int i=0;i<x;i++) {
            for(int j=0;j<y;j++) {
                int status=cell[i][j].getStatus();
                cell[i][j].UpdateStatus();
                if(status==cell[i][j].getStatus()) count++;//计算细胞达到演化平衡时的轮数
            }
        }
        return count;
    }
    public static void printMap(Cell [][]cell) {
        for(int i=0;i<x;i++) {
            for(int j=0;j<y;j++) {
                System.out.print(cell[i][j].getStatus()+" ");//打印细胞地图
            }
            System.out.println();
        }
    }
}

Cell.java

package LifeGame;

public class Cell {
    private int Status;   //0-死亡 1-存活
    private int Living;   //周围活细胞数目
    Cell(){
        Status=0;
        Living=0;
    }
    Cell(int m_Status,int m_Living){
        Status=m_Status;
        Living=m_Living;
    }
    public int getStatus() {
        return Status;//获取状态
    }
    public void setStatus(int m_Status) {
        Status=m_Status;//设置状态
    }
    public int getLiving() {
        return Living;//获取当前周围活细胞数目
    }
    public void setLiving(int m_Living) {
        Living=m_Living;//设置当前周围活细胞数目
    }
    public void UpdateStatus() {
        if(this.getLiving()>3||this.getLiving()<2) this.setStatus(0);
        else if(this.getLiving()==3) this.setStatus(1);
        else this.setStatus(this.Status);
    }
}

2)测试用例设计

a.生命游戏需求分析:

每个细胞的状态由该细胞及周围 8 个细胞上一次的状态所决定;

如果一个细胞周围有 3 个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;

如果一个细胞周围有 2 个细胞为生,则该细胞的生死状态保持不变;

在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。

b.测试用例编写:

①测试数据:无细胞

②测试数据:代码错误

3)测试框架介绍及安装过程

框架介绍:

        JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言).

安装过程:

a.将 JUnit4 单元测试包引入这个项目:在该项目上点右键Properties→Java Build Path→Library→Add Library→JUnit,,如下图所示:

 实验五 单元测试

选择JUnit4

实验五 单元测试

实验五 单元测试

b.将JUnit4单元测试包导入项目

实验五 单元测试

点击ok,进行名称创建等操作

实验五 单元测试

 选择我们所要测试内容

实验五 单元测试

之后在新生成的Test里添加修改即可。

4)测试代码

 CellTest

package LifeGame;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class CellTest {
    private static Cell cell=new Cell();
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        ;
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        ;
    }

    @Test
    public void testUpdateStatus() {
        cell.setLiving(1);
        cell.UpdateStatus();
        assertEquals(0,cell.getStatus());
        cell.setLiving(3);
        cell.UpdateStatus();
        assertEquals(1,cell.getStatus());
        cell.setLiving(4);
        cell.UpdateStatus();
        assertEquals(0,cell.getStatus());
        cell.setStatus(1);
        cell.setLiving(2);
        cell.UpdateStatus();
        assertEquals(1,cell.getStatus());
        cell.setStatus(0);
        cell.setLiving(2);
        cell.UpdateStatus();
        assertEquals(0,cell.getStatus());
    }

}

MapTest

package LifeGame;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class MapTest {
    private static Map map=new Map();
    private static Cell [][]cell=new Cell[16][16];
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        cell=map.initial();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        ;
    }

    @Test
    public void testGetLiving() {
        for(int i=0;i<16;i++) {
            for(int j=0;j<16;j++) {
                cell[i][j].setStatus(1);
            }
        }
        map.getLiving(cell);
        for(int i=0;i<16;i++) {
            for(int j=0;j<16;j++) {
                if(i>0&&i<15&&j>0&&j<15) assertEquals(8,cell[i][j].getLiving());
                else if((i==0||i==15)&&(j>0&&j<15)||(j==0||j==15)&&(i>0&&i<15)) assertEquals(5,cell[i][j].getLiving());
                else assertEquals(3,cell[i][j].getLiving());
            }
        }
        for(int i=0;i<16;i++) {
            for(int j=0;j<16;j++) {
                cell[i][j].setStatus(0);
            }
        }
        map.getLiving(cell);
        for(int i=0;i<16;i++) {
            for(int j=0;j<16;j++) {
                assertEquals(0,cell[i][j].getLiving());
            }
        }
    }

}

5)测试结果与分析

MapTest

实验五 单元测试

 修改值,报错

实验五 单元测试

CellTest

实验五 单元测试

修改值,报错

实验五 单元测试

2.push测试代码带Github仓库

实验五 单元测试

实验五 单元测试

实验五 单元测试

实验小结

  此次实验是代码的单元测试实验,我们小组的是生命游戏程序,但是由于我们之前是用c语言来进行编写的,要使用MiniUnit来进行测试,但是找这个资源实在是太少了,难以寻找。所以更换了一份Java代码。在课下会继续尝试使用其他工具来进行测试。

思考题

比较以下二个工匠的做法,你认为哪种好?结合编码和单元测试,谈谈你的认识。

实验五 单元测试

答:工匠一的做法相当于边写代码边进行测试,这也是 不同于传统的测试方法,这也是方法的转变,可能在这种情况下创作团队的设计思路等会发生改变,有好有坏;工匠二的做法是严格按照流程来,可能会节省一部分时间,但是若期间有更好的想法可能会较难改变。

相关推荐