软构复习——重温实验之lab2(2)

实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:
针对给定的应用问题,从问题描述中识别所需的ADT;
设计ADT 规约(pre-condition、post-condition)并评估规约的质量;
根据ADT 的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP 实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
测试ADT 的实现并评估测试的覆盖度;
使用ADT 及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy 并据此设计测试用例

2 实验环境配置

本次实验需要在Eclipse IDE中安装配置 EclEmma(一个用于统计JUnit 测试用例的代码覆盖度的plugin)。
根据操作提示,在eclipse中的市场中搜索EclEmma,然后安装即可
在这里插入图片描述
在这里插入图片描述

实验过程:

3.1 Poetic Walks

此任务主要是一个图的问题,要求我们完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类,并且在里面实现一系列方法,实现抽象数据型,并用这个Graph的抽象数据型实现GraphPoet类

3.1.2 Problem 1: Test Graph

分别测试add、set、remove、vertices、sources、targets方法。
3.1.3 Problem 2: Implement Graph
该部分要求重写Graph里的方法,分别以点为基础的图和以边为基础的图。
3.1.3.1 Implement ConcreteEdgesGraph
1)表示不变量:
Edge中应该用定义私有类型包括边的长度,边的起点和终点。
在这里插入图片描述

2)检查表示正确性
在这里插入图片描述

3)需要再edge中实现如下类方法
getsource 得到入点
gettarget 得到出点
getweight 得到weight
toString 返回一条边的字符串,即tostring表示![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709110107568.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjA3MTY0,size_16,color_FFFFFF,t_70

(4)AF、RI、safty
在这里插入图片描述

(5)实现 ConcreteEdgesGraph类属性
在这里插入图片描述

public Boolean add 调用 vertices 的 add 方法
public int set 分情况判断:边是否存在以及权重的正负
public Boolean remove 分情况判断:待删顶点与顶点集的关系
public Set vertices 进行防御性复制
public Map<String, Integer> sources 遍历所有的边,判断是否含有出点
public Map<String, Integer> targets 遍历所有的边,判断是否含有入点
public(Override) String toString 重写该类的 toString 方法

(6)测试策略:
测试返回值即可
在这里插入图片描述

覆盖率:

3.1.3.2 Implement ConcreteVerticesGraph
(1)表示不变量:
在这里插入图片描述

(2)检查表示:
在这里插入图片描述

(3) 实现 Verte类方法:
getname 得到点的名字
getsource 得到该点的所有点和边构成的Map
gettarget 得到某个点能到达的所有点和边构成的Map
addsource 在源点Map中加入某源点
addtarget 在终点Map中加入某终点
removesource 在源点表中删除某起始点,返回原边长
removetarget 在终点表中删除某终点,返回原边长
toString 得到一个点的字符串表示

(4)AF,RI和Safety from rep exposure如下图:
在这里插入图片描述

(5)实现ConcreteVerticesGraph的方法
add 调用Vertices的add方法,向表中添加顶点
set 分情况判断:边是否存在;weight正负
remove 分情况判断:待删顶点与顶点集的关系
vertices 进行防御性复制
sources 输入一个终点,遍历所有的边,判断是否含有出点
targets 输入一个起点,遍历所有的边,判断是否含有入点
toString 用字符串表示输出

(6)AF,RI和Safety from rep exposure如下图

在这里插入图片描述

(7)测试
继承Graph的测试策略,只需要增加toString的测试即可:
在这里插入图片描述

覆盖率:在这里插入图片描述

3.1.5 Problem 4: Poetic walks

给定一个语料库,根据文本生成一个单词图,然后给定一条语句输入,在图中搜索词之间的关系,自动补全语句中可能可以完善的部分。

3.1.5.1 Test GraphPoet

测试用例均在 test 文件包的 poet 子文件里
我们需要注意以下几点:
等价类划分:两个单词之间不存在连接词,两个单词之间只有一个连接词,两个单词之间有多个连接词。
在基于预设的测试用例基础上,增加等价类划分的多种情况。
此外还要注意句末的句号,测试当一个句子最后一个词是“桥”的一端。

3.1.5.2 Implement GraphPoet

(1)定义私有类型的表如下图所示:
在这里插入图片描述
(2) AF,RI和Safety from rep exposure如下
在这里插入图片描述
(3)在GraphPoet中需要实现的方法如下
GraphPoet 一行一行读入文件内容并储存在List中,在图中添加边
checkRep 检查合法性,保存从语料库文件生成的图
poem 将输入的文本按照空格进行划分,分别求两个单词的sources和targets,将该Map转换为Set求交集;若交集为空,则无桥,若交集不空,则在交集中找最短的桥
toString 将整个图中所有点的指向转化为一条字符串输出

3.1.6 Before you’re done

输入
git add *
git commit -m “third commit”
git push -u origin master
即可提交至仓库。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值