20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告
20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告
(一)单元测试
- 在 IDEA中我们把产品代码放在
src
目录中,把测试代码放在test
目录中,右键单击项目,在弹出的菜单中选择New->Directory
新建一个目录; test
目录中放的也是Java代码,在弹出的菜单中选择Mark Directory as->Test Sources Root
就可以了:
TDD(测试驱动开发):
- 伪代码(思路)
- 测试代码(产品预期功能)
- 产品代码(实现预期功能)
基于TDD,可以有效避免过度开发的现象,因为我们只需要让测试通过即可。
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
代码需求
- 实现成绩的转换,百分制转五分制,并输出结果。
伪代码
- 根据上面的需求,可以先写出程序的伪代码,伪代码是一个程序最好的注释,有助于我们理解问题和解决问题,改程序伪代码如下:
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
产品代码
- 根据伪代码不难编出产品代码,通过老师给的关键方法提示,我定义了设定复数的方法,代码段如下:
public class Main{
public static String percentage2fivegrade(int grade){
//如果成绩小于60,转成“不及格”
if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade < 100)
return "优秀";
//其他,转成“错误”
else
return "错误";
}
}
- 测试代码
1.正常情况测试
public class Main {
public static void main(String[] args) {
//测试正常情况
if(Main.percentage2fivegrade(55) != "不及格")
System.out.println("test failed!");
else if(Main.percentage2fivegrade(65) != "及格")
System.out.println("test failed!");
else if(Main.percentage2fivegrade(75) != "中等")
System.out.println("test failed!");
else if(Main.percentage2fivegrade(85) != "良好")
System.out.println("test failed!");
else if(Main.percentage2fivegrade(95) != "优秀")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
运行结果:测试成功
2.50分测试
public class MainTest {
public static void main(String[] args) {
// 百分制成绩是50时应该返回五级制的“不及格”
if(Main.percentage2fivegrade(50) != "不及格")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
运行结果:成功
3.异常情况测试
public class MyUtilTest {
public static void main(String[] args) {
//测试出错情况
if(MyUtil.percentage2fivegrade(-10) != "错误")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(115) != "错误")
System.out.println("test failed 2!");
else
System.out.println("test passed!");
}
}
测试结果:失败
4.增加判断负分或大于100分情况
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于0,转成“错误”
if ((grade < 0))
return "错误";
//如果成绩小于60,转成“不及格”
else if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade < 100)
return "优秀";
//如果成绩大于100,转成“错误”
else
return "错误";
}
}
运行结果
5.测试边界情况
public class MainTest {
public static void main(String[] args) {
//测试边界情况
if(Main.percentage2fivegrade(0) != "不及格")
System.out.println("test failed 1!");
else if(Main.percentage2fivegrade(60) != "及格")
System.out.println("test failed 2!");
else if(Main.percentage2fivegrade(70) != "中等")
System.out.println("test failed 3!");
else if(Main.percentage2fivegrade(80) != "良好")
System.out.println("test failed 4!");
else if(Main.percentage2fivegrade(90) != "优秀")
System.out.println("test failed 5!");
else if(Main.percentage2fivegrade(100) != "优秀")
System.out.println("test failed 6!");
else
System.out.println("test passed!");
}
}
运行结果:
学会 IDEA中配置单元测试工具JUnit
打开IDEA,选择
File->Setting
打开设置对话框在设置对话框中选择
Plugins
, 单击Marketplace
选择
JUnitGenerator V2.0
,点击Install
安装安装完成后重启IDEA,要开始配置。
- 我们在IDEA中新建一个项目,然后新建一个空类MyUtil:
- 鼠标右击类名,选择
go to->test->Create New Test
- 鼠标右击类名,选择
- 弹出如下框框,选择
JUnit3
- 弹出如下框框,选择
这时你会发现你的测试代码放在了src文件夹中,为了区分源代码和测试代码,所以我新建了的一个
test
文件夹存放测试代码,并将其设置为Test Sources Root
,这样你的测试代码就可以自动的放在该文件夹中。注意:若显示
TestCase
是红色的,需要在IDEA中的项目中加入junit.jar包,junit.jar包:File
->Project Structure
->Dependancies
->单击+
->JARs or Directories
单元测试用例
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("优秀", MyUtil.percentage2fivegrade(95));
}
@Test
public void testException() {
assertEquals("错误", MyUtil.percentage2fivegrade(105));
assertEquals("错误", MyUtil.percentage2fivegrade(-55));
}
@Test
public void testBoundary() {
assertEquals("不及格", MyUtil.percentage2fivegrade(0));
assertEquals("及格", MyUtil.percentage2fivegrade(60));
assertEquals("中等", MyUtil.percentage2fivegrade(70));
assertEquals("良好", MyUtil.percentage2fivegrade(80));
assertEquals("优秀", MyUtil.percentage2fivegrade(90));
assertEquals("错误", MyUtil.percentage2fivegrade(100));
}
}
运行结果:成功
任务二
- StringBuffer的方法
产品代码
public class StringBufferDemo {
public StringBuffer setBuffer() {
StringBuffer buffer = new StringBuffer();
buffer.append('j');
buffer.append("kjxlkjc");
System.out.println(buffer.charAt(1));
System.out.println(buffer.length());
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("jx"));
System.out.println(buffer.toString());
return buffer;
}
}
对于这个程序,有五个方法需要测试,分别是:
charAt(int i)
:返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推,这类似于数组索引capacity()
:返回当前容量。容量指可用于最新插入的字符的存储量,超过这一容量就需要再次进行分配length()
:返回子浮窗的长度indexOf(String s)
:返回输入的子字符串的第一个字母在母字符串的位置toString(String s)
:返回此对象本身(它已经是一个字符串)
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer buffer1 = new StringBuffer();
StringBuffer buffer2 = new StringBuffer("i am a student");
StringBuffer buffer3 = new StringBuffer("i like java");
StringBufferDemo stringBufferDemo = new StringBufferDemo();
@Test
public void testcharAt() {
buffer1.append('h');
buffer1.append("ello java");
assertEquals('l',buffer1.charAt(2));
assertEquals('h',buffer1.charAt(0));
assertEquals('k',stringBufferDemo.setBuffer().charAt(1));
}
@Test
public void testlength(){
assertEquals(0,buffer1.length());
assertEquals(14,buffer2.length());
assertEquals(11,buffer3.length());
assertEquals(8,stringBufferDemo.setBuffer().length());
}
@Test
public void testcapacity(){
assertEquals(16,buffer1.capacity());
assertEquals(30,buffer2.capacity());
assertEquals(27,buffer3.capacity());
assertEquals(16,stringBufferDemo.setBuffer().capacity());
}
public void testToString(){
assertEquals("",buffer1.toString());
assertEquals("i am a student",buffer2.toString());
assertEquals("i like java",buffer3.toString());
assertEquals("jkjxlkjc",stringBufferDemo.setBuffer().toString());
}
public void testIndexOf(){
assertEquals(0,buffer1.indexOf(""));
assertEquals(2,buffer2.indexOf("am a st"));
assertEquals(7,buffer3.indexOf("java"));
assertEquals(2,stringBufferDemo.setBuffer().indexOf("jxlk"));
}
}
运行结果
任务三
- 题目:4.让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
产品代码
// Server Classes
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=5316;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Float extends Data {
float value;
Float() {
value=1.23456F;
}
public void DisplayValue(){
System.out.println (value);
}
}
// Pattern Classes
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class FloatFactory extends Factory {
public Data CreateDataObject(){
return new Float();
}
}
class Document { //Client classes
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d,f;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
f = new Document(new FloatFactory());
f.DisplayData();
}
}
运行截图
任务四
产品代码
abstract class Data {
abstract public void DisplayValue();
}
class Float extends Data {
float value;{
value=20175316.4369f;
}
public void DisplayValue(){
System.out.println (value);
}
}
// Pattern Classes
abstract class Factory {
abstract public Data CreateDataObject();
}
class FloatFactory extends Factory {
public Data CreateDataObject(){
return new Float();
}
}
//Client classes
class Document {
Data data;
Document(Factory factory){
data = factory.CreateDataObject();
}
public void DisplayData(){
data.DisplayValue();
}
}
public class MyDoc {
static Document d;
MyDoc(Document d) {
this.d = d;
}
public static void main(String[] args) {
d = new Document(new FloatFactory());
d.DisplayData();
}
}
- TDD方式开发复数类Complex
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex c1 = new Complex(1.0, 2.0);
Complex c2 = new Complex(2.0, 2.0);
Complex c3 = new Complex(2.0, 0.0);
@Test
public void testComplexAdd() throws Exception {
assertEquals("3.0+4.0i", c1.ComplexAdd(c2).toString());
assertEquals("3.0+2.0i", c1.ComplexAdd(c3).toString());
assertEquals("4.0+2.0i", c2.ComplexAdd(c3).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("-1.0", c1.ComplexSub(c2).toString());
assertEquals("-1.0+2.0i", c1.ComplexSub(c3).toString());
assertEquals("0.0+2.0i", c2.ComplexSub(c3).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("-2.0+6.0i", c1.ComplexMulti(c2).toString());
assertEquals("2.0+4.0i", c1.ComplexMulti(c3).toString());
assertEquals("4.0+4.0i", c2.ComplexMulti(c3).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("0.75+0.75i", c1.ComplexDiv(c2).toString());
assertEquals("1.0+0.5i", c1.ComplexDiv(c3).toString());
assertEquals("1.0+1.0i", c2.ComplexDiv(c3).toString());
}
}
运行结果:测试成功
任务五
使用StarUML对实验二中的代码进行建模
点开
StarUML
程序后,在右下角的选项中选择Class
选项建立一个类的UML图
按照下图中提示分别创建对应的变量层和方法层
在右下角选项中选择
Generalization
选项,创建类与类之间的调用关系
UML类截图
码云连接
https://gitee.com/shengmaosong/java-besti-20175316/tree/master/shiyan2/src
实验中遇到的问题
-(1)junit.jar找不到
实验感受
本次实验较难较麻烦,需要细心耐心的一步步做,锻炼我的细心程度,从本次实验中学到了很多,希望以后继续努力。
20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告的更多相关文章
- 20175316盛茂淞-Java第1周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java入门 1.Java简介(地位,特点) 2.安装JDK,设置系统环境 3.编译J ...
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验五 《网络安全与编程》 实验报告
20175316 盛茂淞 2018-2019-2 <Java程序设计>实验五 <网络安全与编程> 实验报告 一.实验报告封面 课程:Java程序设计 班级:1753班 姓名:盛 ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第9周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 下载安装MySQL数据库管理系统. 学习<Java程序设计>第十一章MyS ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第8周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十五章 泛型 -- 主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据 ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第7周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 第八章 常用实用类 一.String类 String类在java.lang包中,jav ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第6周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 第7章 内部类与异常类 1.使用 try.catch Java中所有信息都会被打包为对 ...
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20175316 盛茂淞 2018-2019-2 <Java程序设计>实验一 Java开发环境的熟悉 实验报告 一.实验要求 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 接口与实现. 何谓接口 接口:书上没有明确地给出接口的定义,我理解的接口就是一 ...
- 20175316盛茂淞 2018-2019-2《Java程序设计》第4周学习总结
20175316盛茂淞 2018-2019-2<Java程序设计>第4周学习总结 教材学习内容总结 第五章 子类与继承 一.继承 1.继承定义:避免多个类间重复定义共同行为 2.子类与父类 ...
随机推荐
- PHP入门——基本巩固
----------一.变量 ----------二.运算 ----------三.控制结构 ----------四.函数 ----------六.字符串 ----------七.数组 ------- ...
- cmd命令行模式开启或关闭 windows功能 (转载)
1,用管理员身份运行cmd. 2,运行 dism /online /Get-Features >C:\1.txt,这样会在C盘生成一个txt文件,文件内容是功能列表,可以对照“打开或关闭win ...
- python中线程2
cpython中的GIL和pool GIL锁(全局解释器锁) 1.what? GIL是全局解释器锁,和普通锁加在数据上不同的是:GIL加在加在解释器上,是为了防止多个线程在同一时间执行python字节 ...
- 用python发送短消息(基于阿里云平台)
新版短信接口在线测试页面:https://api.aliyun.com/new#/?product=Dysmsapi&api=SendSms¶ms={}&tab=DEM ...
- The message port closed before a response was received.
问题描述:Chrome控制台报错:Unchecked runtime.lastError: The message port closed before a response was received ...
- conda国内源的设置 by dwSun
conda国内源的设置 by dwSun anaconda是一个balabalabala... 知道这个软件的人肯定不用介绍,不知道的也不必介绍. conda是anaconda的包管理器,通过cond ...
- Homework:工作日 还是周末
/* 程序功能: 要求用户从键盘输入1~7之间的整数 如果输入的是1~5, 提示用户是工作日,要努力工作: 如果输入的是6或7,提示用户是休息日,放松休息: 否则,提示用户输入不在合法范围 */ #i ...
- JQuery+formValidator实现表单验证
<!-- 需求: 用户注册页面要有用户名.密码.确认密码.邮箱 用户名文本框:用户名不能为空,且必须为数字与字母的6到12位的组合 密码框:密码不能为空,最少6位,包括至少1个大写字母,1个小写 ...
- Blender软件基本介绍(3D建模软件)
1.Blender的好处: 1>.开源免费 2>.体积比较小 3>.和Unity的交互比较好(一般建模软件需要导出FBX的文件,然后用到Unity中,而Blender不需要导出,只需 ...
- [转]Flash开发技能树