新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
分类: 电脑/网络 程序设计 其他编程语言
浔阳ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
解析:
JUnit是Java进行单元测试的一个框架, 需要下载junit, 3.8版本和后来的4.0以后版本编写测试的方法略有不同,
在3.8.2中需要导入junit.framework.中的类, 进行测试的类必须继承自TestCase类, 测试方法名称中需要含test字样, 可以在setup和teardown函数中管理一些每个测试函数都需要的资源比如数据库连接等,在测试函数中使用assert开头的函数来进行测试代码开发.以下是从junit文档中摘出的范例:
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Some simple tests.
*
*/
public class SimpleTest extends TestCase {
protected int fValue1;
protected int fValue2;
protected void setUp() {
fValue1= 2;
fValue2= 3;
}
public static Test suite() {
/*
* the type safe way
*
TestSuite suite= new TestSuite();
suite.addTest(
new SimpleTest("add") {
protected void runTest() { testAdd(); }
}
);
suite.addTest(
new SimpleTest("testDivideByZero") {
protected void runTest() { testDivideByZero(); }
}
);
return suite;
*/
/*
* the dynamic way
*/
return new TestSuite(SimpleTest.class);
}
public void testAdd() {
double result= fValue1 + fValue2;
// forced failure result == 5
assertTrue(result == 6);
}
public void testDivideByZero() {
int zero= 0;
int result= 8/zero;
result++; // avoid warning for not using result
}
public void testEquals() {
assertEquals(12, 12);
assertEquals(12L, 12L);
assertEquals(new Long(12), new Long(12));
assertEquals("Size", 12, 13);
assertEquals("Capacity", 12.0, 11.99, 0.0);
}
public static void main (String[] args) {
junit.textui.TestRunner.run(suite());
}
}
在4.0.2中的变化是:
测试需要@.junit.Test的Annotation标记,其他部分也使用了Annotation标记,setup和teardown使用@.junit.Before 和@.junit.After, 在eclipse3.1的环境中不支持4.0.2, 可以使用junit 4.0.2中提供的adapter类来帮助eclipse内置的junit发现新版本的测试函数
使用框架来用于单元测试
Java提供了若干用于单元测试的框架。TestNG和JUnit是最流行的测试框架。JUnit和TestNG的一些重要功能:
易于设置和运行。
支持注释
允许忽略或分组并一起执行某些测试。
支持参数化测试,即通过在运行时指定不同的值来运行单元测试。
通过与构建工具,如Ant,Maven和Gradle集成来支持自动化的测试执行。
EasyMock是一个模拟框架,是单元测试框架,如JUnit和TestNG的补充。EasyMock本身不是一个完整的框架。它只是添加了创建模拟对象以便于测试的能力。例如,我们想要测试的一个方法可以调用从数据库获取数据的DAO类。在这种情况下,EasyMock可用于创建返回硬编码数据的MockDAO。这使我们能够轻松地测试我们意向的方法,而不必担心数据库访问。
谨慎使用测试驱动开发!
测试驱动开发(TDD)是一个软件开发过程,在这过程中,在开始任何编码之前,我们基于需求来编写测试。由于还没有编码,测试最初会失败。然后写入最小量的代码以通过测试。然后重构代码,直到被优化。
目标是编写覆盖所有需求的测试,而不是一开始就写代码,却可能甚至都不能满足需求。TDD是伟大的,因为它导致简单的模块化代码,且易于维护。总体开发速度加快,容易发现缺陷。此外,单元测试被创建作为TDD方法的副产品。
然而,TDD可能不适合所有的情况。在设计复杂的项目中,专注于最简单的设计以便于通过测试用例,而不提前思考可能会导致巨大的代码更改。此外,TDD方法难以用于与遗留系统,GUI应用程序或与数据库一起工作的应用程序交互的系统。另外,测试需要随着代码的改变而更新。
因此,在决定采用TDD方法之前,应考虑上述因素,并应根据项目的性质采取措施。
测量代码覆盖率
代码覆盖率衡量(以百分比表示)了在运行单元测试时执行的代码量。通常,高覆盖率的代码包含未检测到的错误的几率要低,因为其更多的源代码在测试过程中被执行。测量代码覆盖率的一些最佳做法包括:
使用代码覆盖工具,如Clover,Corbetura,JaCoCo或Sonar。使用工具可以提高测试质量,因为这些工具可以指出未经测试的代码区域,让你能够开发开发额外的测试来覆盖这些领域。
每当写入新功能时,立即写新的测试覆盖。
确保有测试用例覆盖代码的所有分支,即if / else语句。
高代码覆盖不能保证测试是完美的,所以要小心!
尽可能将测试数据外部化
在JUnit4之前,测试用例要运行的数据必须硬编码到测试用例中。这导致了限制,为了使用不同的数据运行测试,测试用例代码必须修改。但是,JUnit4以及TestNG支持外部化测试数据,以便可以针对不同的数据集运行测试用例,而无需更改源代码。
使用断言而不是Print语句
许多新手开发人员习惯于在每行代码之后编写System.out.println语句来验证代码是否正确执行。这种做法常常扩展到单元测试,从而导致测试代码变得杂乱。除了混乱,这需要开发人员手动干预去验证控制台上打印的输出,以检查测试是否成功运行。更好的方法是使用自动指示测试结果的断言。
构建具有确定性结果的测试
一些方法不具有确定性结果,即该方法的输出不是预先知道的,并且每一次都可以改变
除了正面情景外,还要测试负面情景和边缘情况
通常,开发人员会花费大量的时间和精力编写测试用例,以确保应用程序按预期工作。然而,测试负面测试用例也很重要。负面测试用例指的是测试系统是否可以处理无效数据的测试用例。例如,考虑一个简单的函数,它能读取长度为8的字母数字值,由用户键入。除了字母数字值,应测试以下负面测试用例:
用户指定非字母数字值,如特殊字符。
用户指定空值。
用户指定大于或小于8个字符的值。
类似地,边界测试用例测试系统是否适用于极端值。例如,如果用户希望输入从1到100的数字值,则1和100是边界值,对这些值进行测试系统是非常重要的。
是控制台输入吗。为了方便类都写一个里面了。可以参考下
建立一个题目实体(标题、4个选项属性、正确答案);
建立一个结果实体(标题、是否正确结果、选择的答案、正确答案);
建立一个题目list集合,用于存放题目(每个难度对应一个list);
建立一个结果list集合,用于存放作答后的信息;
创建对应的题目对象,实体化实体,并且放入对应的list里面
根据选择对应的难度找到对应难度的list集合;
然后遍历这个集合,依次显示每个题目的信息,并让用户作答,答完一个显示下一个题目,
获取用户选择的答案,用这个答案跟实体中的正确答案做比较;
创建结果实体对象,将比较后的信息set到实体中。(标题、正确结果、选择的答案、正确答案);
将这个结果实体放入到结果list集合中;循环结束后遍历结果list集合显示就可以了。
代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SaveLog {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 提示信息
System.out.println("请输入数字选择题目难度,1:简单,2:困难");
// 获取到对应难度的题目
ListQuestion questionList = getQuestionByLevel(in.nextInt());
// 创建结果list
ListQuestionResult questionResults = new ArrayListQuestionResult();
// 总答题,正确,错误
int questionCount = questionList.size();
int correntCount = 0;
int errorCount = 0;
// 遍历题目
for (int i = 0; i questionList.size(); i++) {
// 获取到题目
Question question = questionList.get(i);
System.out.println("题目" + (i + 1) + ":" + question.getTitle());
// 获取到题目选项并打印控制台
ListString selected = question.getList();
for (String string : selected) {
System.out.println(string);
}
// 获取到选择的答案
String corrent = in.next();
// 获取到做题结果
QuestionResult qr = setQuestionResult(question, corrent);
// 计算错误与正确的题目
if (corrent.equalsIgnoreCase(question.getCorrentResult())) {
correntCount = correntCount + 1;
} else {
errorCount = errorCount + 1;
}
// 放入结果集合
questionResults.add(qr);
}
System.out.println("您一共答了" + questionCount + "道题,其中正确的为" + correntCount + "题,错误为" + errorCount + "题");
System.out.println();
// 遍历结果
for (QuestionResult questionResult : questionResults) {
if (!questionResult.getSelected().equals(questionResult.getCorrentResult())) {
System.out.println("错误题目:" + questionResult.getTitle());
System.out.println("是否正确:" + questionResult.getResult());
System.out.println("选择的答案:" + questionResult.getSelected() + ",正确答案:" + questionResult.getCorrentResult());
System.out.println();
}
}
}
public static QuestionResult setQuestionResult(Question question, String corrent) {
QuestionResult result = new QuestionResult();
result.setCorrentResult(question.getCorrentResult());
result.setTitle(question.getTitle());
result.setSelected(corrent);
// 如果答案正确
if (corrent.equalsIgnoreCase(question.getCorrentResult())) {
result.setResult("正确");
} else {
result.setResult("错误");
}
return result;
}
/** 根据难度获取对应题目(1:简单。2:困难) */
public static ListQuestion getQuestionByLevel(int level) {
ListQuestion result = null;
if (level == 1) {
// 创建list集合用于存放题目,简单难度
ListQuestion questionList = new ArrayListQuestion();
// 添加题目到list
Question question = new Question();
question.setTitle("中国文化博大精深,请问1+2等于几?");
// 题目答案选项
ListString list = new ArrayListString();
list.add("A:1");
list.add("B:2");
list.add("C:3");
list.add("D:6");
question.setCorrentResult("C");
question.setList(list);
// 将题目放到list集合
questionList.add(question);
// 设置返回结果
result = questionList;
} else if (level == 2) {
// 创建list集合用于存放题目,简单难度
ListQuestion questionList = new ArrayListQuestion();
// 添加题目到list
Question question = new Question();
question.setTitle("朝辞白帝彩云间的下一句是什么?");
// 题目答案选项
ListString list = new ArrayListString();
list.add("A:千里江陵一日还");
list.add("B:野火烧不尽");
list.add("C:离离原上草");
list.add("D:智商捉鸡");
question.setCorrentResult("A");
question.setList(list);
// 将题目放到list集合
questionList.add(question);
// 设置返回结果
result = questionList;
}
return result;
}
}
/** 题目结果类 */
class QuestionResult {
/** 题目名称 */
private String title;
/** 是否正确 */
private String result;
/** 选择的答案 */
private String selected;
/** 正确答案 */
private String correntResult;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getSelected() {
return selected;
}
public void setSelected(String selected) {
this.selected = selected;
}
public String getCorrentResult() {
return correntResult;
}
public void setCorrentResult(String correntResult) {
this.correntResult = correntResult;
}
}
/** 题目类 */
class Question {
/** 题目名称 */
private String title;
/** 题目的所有选项 */
private ListString list;
/** 正确答案 */
private String correntResult;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ListString getList() {
return list;
}
public void setList(ListString list) {
this.list = list;
}
public String getCorrentResult() {
return correntResult;
}
public void setCorrentResult(String correntResult) {
this.correntResult = correntResult;
}
}