实验报告 纪欣
一、题目简介
一元一次方程求解
二、源码的github链接
https://github.com/jixin1995/ceshi1/blob/master/text
https://github.com/jixin1995/ceshi1/blob/master/text1
三、所设计的模块测试用例、测试结果截图
(1)被测试的类
package junittest;
public class MyMath
{
public double oneEquation(double a,double b)
{
//如果a=0,则防范无法求解
if(a==0)
{
System.out.println("参数错误");
throw new ArithmeticException("参数错误");
}
else
{
System.out.println("一元一次方程有解");
return -b/a;
}
}
public double[] twoEquation(double a,double b,double c)
{
double[] result;
if(a==0)
{
System.out.println("****************************");
throw new ArithmeticException("参数错误");
}
//有理数范围内无根
else if(b*b-4*a*c<0)
{
System.out.println("****************************");
throw new ArithmeticException("方程在理数范围内无解");
}
//方程有唯一的解
else if(b*b-4*a*c==0)
{
System.out.println("****************************");
System.out.println("方程存在唯一的解");
result=new double[1];
result[0]=-b/(2*a);
return result;
}
//方程有两个根
else
{
System.out.println("****************************");
System.out.println("方程存在两个解");
result=new double[2];
//使用数组返回方程的两个根
result[0]=(-b+Math.sqrt(b*b-4*a*c))/2/a;
result[1]=(-b-Math.sqrt(b*b-4*a*c))/2/a;
return result;
}
}
}
(2)测试类
package junittest;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
public class MyMathTest
{
//将需要测试的类,声明成成员变量
MyMath math;
//每次运行测试方法之前都会运行该方法
@Before
public void setUp()
{
math=new MyMath();
}
//每次运行测试用例之后都会运行该方法
@After
public void tearDown()
{
math=null;
}
//测试一元一次方程的求解
//expected=ArithmeticException.class
//相当于断言该测试方法将会抛出ArithmeticException异常
@Test(expected=ArithmeticException.class)
public void testOneEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元一次方程求解");
//断言该方程求解应该为-1.8
assertEquals(math.oneEquation(5,9),-1.8,.00001);
//断言当a==0时的情况
assertEquals(math.oneEquation(0,3),-1);
}
//测试一元二次方程的求解
@Test
public void testTwoEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元二次方程求解");
double[] tmp=math.twoEquation(1,-3,2);
//断言方程的两个解,一个为2,一个为3
assertEquals("第一个解出错",tmp[0],2,.00001);
assertEquals("第二个解出错",tmp[1],3,.00001);
}
//程序的入口,直接运行该测试用例
public static void main(String[] args)
{
//运行单个的测试用例
JUnitCore.main("junittest.MyMathTest");
}
}
(3)测试效果图
package junittest;
public class MyMath
{
public double oneEquation(double a,double b)
{
//如果a=0,则防范无法求解
if(a==0)
{
System.out.println("参数错误");
throw new ArithmeticException("参数错误");
}
else
{
System.out.println("一元一次方程有解");
return -b/a;
}
}
public double[] twoEquation(double a,double b,double c)
{
double[] result;
if(a==0)
{
System.out.println("****************************");
throw new ArithmeticException("参数错误");
}
//有理数范围内无根
else if(b*b-4*a*c<0)
{
System.out.println("****************************");
throw new ArithmeticException("方程在理数范围内无解");
}
//方程有唯一的解
else if(b*b-4*a*c==0)
{
System.out.println("****************************");
System.out.println("方程存在唯一的解");
result=new double[1];
result[0]=-b/(2*a);
return result;
}
//方程有两个根
else
{
System.out.println("****************************");
System.out.println("方程存在两个解");
result=new double[2];
//使用数组返回方程的两个根
result[0]=(-b+Math.sqrt(b*b-4*a*c))/2/a;
result[1]=(-b-Math.sqrt(b*b-4*a*c))/2/a;
return result;
}
}
}
package junittest;
public class HelloWorld {
//方法简单的返回字符串
public String sayHello()
{
System.out.println("HelloWorld");
return "Hello world";
}
//计算两个整数的和
public int add(int a,int b)
{
System.out.println("a+b="+(a+b));
return a+b;
}
}
(2)测试用例类
package junittest;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
public class MyMathTest
{
//将需要测试的类,声明成成员变量
MyMath math;
//每次运行测试方法之前都会运行该方法
@Before
public void setUp()
{
math=new MyMath();
}
//每次运行测试用例之后都会运行该方法
@After
public void tearDown()
{
math=null;
}
//测试一元一次方程的求解
//expected=ArithmeticException.class
//相当于断言该测试方法将会抛出ArithmeticException异常
@Test(expected=ArithmeticException.class)
public void testOneEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元一次方程求解");
//断言该方程求解应该为-1.8
assertEquals(math.oneEquation(5,9),-1.8,.00001);
//断言当a==0时的情况
assertEquals(math.oneEquation(0,3),-1);
}
//测试一元二次方程的求解
@Test
public void testTwoEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元二次方程求解");
double[] tmp=math.twoEquation(1,-3,2);
//断言方程的两个解,一个为2,一个为3
assertEquals("第一个解出错",tmp[0],2,.00001);
assertEquals("第二个解出错",tmp[1],3,.00001);
}
}
package junittest;
import static org.junit.Assert.*;
import org.junit.Test;
public class HelloWorldTest {
@Test
public void testSayHello()
{
System.out.println("");
HelloWorld hello=new HelloWorld();
assertEquals("sayHello方法出错",hello.sayHello(),"Hello world");
}
@Test
public void testAdd()
{
HelloWorld hello=new HelloWorld();
assertEquals(hello.add(1, 2),3);
}
}
(3) 测试类
package junittest;
import org.junit.runner.JUnitCore;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
junittest.MyMathTest.class,
junittest.HelloWorldTest.class
})
public class AllTests {
public static void main(String[] args)
{
JUnitCore.main("junittest.AllTests");
}
}
@RunWith(Suite.class)
@Suite.SuiteClasses({
junittest.MyMathTest.class,
junittest.HelloWorldTest.class
})
(4) 测试结果效果图
四、心得体会
测试通过了,CalculatorTest2类里的parameter是每次的测试输入,result就是测试的结果。所有的测试输入和期望结果都在@Parameters标注的data函数的返回的Collection集合里,2的期望得到的平方结果值是4,0期望得到0,-3期望得到9。
把测试代码提交给JUnit框架后,框架如何来运行代码呢?答案就是——Runner。在JUnit中有很多个 Runner,他们负责调用测试代码,每一个Runner都有各自的特殊功能,要根据需要选择不同的Runner来运行测试代码。JUnit中有一个默认Runner,如果没有指定,那么系统自动使用默认 Runner来运行你的代码。这里参数化测试就没有再用默认的Runner了。
我从中学到了好多,但其中还有好多不足,还需要好好的改进。
https://github.com/jixin1995/ceshi1/blob/master/text