• 实验五 单元测试


    实验五 单元测试

    一、实验目的

    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代码。在课下会继续尝试使用其他工具来进行测试。

    思考题

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

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

  • 相关阅读:
    构造函数的继承
    创建一个不被销毁的空间 闭包小应用
    如何在Linux上恢复误删除的文件或目录
    一文详解 Ansible 自动化运维
    Shell 脚本编程最佳实践
    10 分钟看懂 Docker 和 K8S!
    BGP路由协议详解(完整版)
    浅析 Linux 中的零拷贝技术
    2020年DevOps工程师入门指南
    一条更新的SQL如何执行
  • 原文地址:https://www.cnblogs.com/2574203740lx/p/13055177.html
Copyright © 2020-2023  润新知