Java 为软件QA类的介绍编写一个简单的JUnit测试?
我的任务是编写一个小程序以及JUnit和覆盖率测试,我在理解如何编写JUnit方面遇到了一些问题 我以前为其他类项目编写过JUnit测试,并得到了知识更丰富的队友的帮助。它们都是用于我们可以实例化、使用和检查的类(使用Java 为软件QA类的介绍编写一个简单的JUnit测试?,java,unit-testing,netbeans,junit,Java,Unit Testing,Netbeans,Junit,我的任务是编写一个小程序以及JUnit和覆盖率测试,我在理解如何编写JUnit方面遇到了一些问题 我以前为其他类项目编写过JUnit测试,并得到了知识更丰富的队友的帮助。它们都是用于我们可以实例化、使用和检查的类(使用assert…()) 我们被告知要编写的程序是一个简单的控制台应用程序,它接收一些值,计算一些值,然后返回。下面是我写的,它只需要在某个范围内输入一个可变的数字,然后计算最小值、最大值和平均值 我面临的问题是,我不确定如何才能根据以前的编写方式来编写JUnit。我不确定如何在单元测
assert…()
)
我们被告知要编写的程序是一个简单的控制台应用程序,它接收一些值,计算一些值,然后返回。下面是我写的,它只需要在某个范围内输入一个可变的数字,然后计算最小值、最大值和平均值
我面临的问题是,我不确定如何才能根据以前的编写方式来编写JUnit。我不确定如何在单元测试中“伪造”用户对控制台的输入
我请求帮助我如何着手为这一软件编写JUnit测试
package softqa_assignment2;
import java.io.Console;
import java.util.LinkedList;
public class SoftQA_Assignment2
{
public static void main(String[] args)
{
Console cons = System.console();
if (cons == null)
{
System.err.println("System could not provide console, exiting");
System.exit(1);
}
System.out.println("--------------------");
System.out.println("Welcome, this program computes the minimum, maximum, and average of 10-20 numbers.");
System.out.println("Input \"Q\" at anytime to quit.");
System.out.println("--------------------");
int numVals = 0;
boolean gotNumVals = false;
while(!gotNumVals)
{
String numValsStr = cons.readLine("Enter number of numbers (10-20): ");
if(numValsStr.equals("Q"))
{
System.err.println("Encountered \"Q\", quiting program...");
System.exit(1);
}
try
{
numVals = Integer.parseInt(numValsStr);
}
catch(NumberFormatException e)
{
System.out.println("Please input a integer value between 10 and 20.");
continue;
}
if(numVals < 10 || numVals > 20)
{
System.out.println("Please input a integer value between 10 and 20.");
continue;
}
else
gotNumVals = true;
}
System.out.println("--------------------");
int valsGot = 0;
LinkedList<Double> vals = new LinkedList<>();
while(valsGot < numVals)
{
String numValueStr = cons.readLine((valsGot + 1) + ": Enter a number: ");
if(numValueStr.equals("Q"))
{
System.err.println("Encountered \"Q\", quiting program...");
System.exit(1);
}
double numToAdd = 0;
try
{
numToAdd = Double.parseDouble(numValueStr);
}
catch(NumberFormatException e)
{
System.out.println("Please input a proper value.");
continue;
}
vals.add(numToAdd);
valsGot++;
}
System.out.println("--------------------");
System.out.println("Done getting numbers, computing output...");
System.out.println("--------------------");
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
double avg = 0.0;
for(int i = 0; i < vals.size(); i++)
{
avg += vals.get(i);
if(vals.get(i) < min)
min = vals.get(i);
if(vals.get(i) > max)
max = vals.get(i);
}
avg /= vals.size();
System.out.println("Minimum: " + min + "\n Maximum: " + max + "\n Average: " + avg);
System.out.println("--------------------");
}
}
软件包质量保证分配2;
导入java.io.Console;
导入java.util.LinkedList;
公共类软件质量保证单元分配2
{
公共静态void main(字符串[]args)
{
Console cons=System.Console();
如果(cons==null)
{
System.err.println(“系统无法提供控制台,正在退出”);
系统出口(1);
}
System.out.println(“------------------”);
System.out.println(“欢迎,这个程序计算10-20个数字的最小值、最大值和平均值。”);
System.out.println(“随时输入\“Q\”以退出”);
System.out.println(“------------------”);
int numVals=0;
布尔gotNumVals=false;
而(!gotNumVals)
{
字符串numValsStr=cons.readLine(“输入数字的数量(10-20):”;
如果(numValsStr.equals(“Q”))
{
System.err.println(“遇到\“Q\”,退出程序…”);
系统出口(1);
}
尝试
{
numVals=Integer.parseInt(numValsStr);
}
捕获(数字格式)
{
System.out.println(“请输入一个介于10和20之间的整数值”);
继续;
}
如果(numVals<10 | | numVals>20)
{
System.out.println(“请输入一个介于10和20之间的整数值”);
继续;
}
其他的
gotNumVals=true;
}
System.out.println(“------------------”);
int=0;
LinkedList VAL=新建LinkedList();
while(valsGot最大值)
最大值=VAL.get(i);
}
平均值/=VAL.size();
System.out.println(“最小值:+min+”\n最大值:+max+”\n平均值:+avg);
System.out.println(“------------------”);
}
}
您可以有一个布尔变量,比如condition=false
现在,如果程序能够正常运行而没有任何错误,那么在计算了最小值/最大值/平均值之后,可以将其设置为true。然后用这个断言。这个断言可以在try-and-catch块之后的finally块中进行。如果出现任何错误,将调用catch,并且不应将条件设置为true。因此,assert应该返回否定
如果您已经知道用户将输入的值,那么最好使用适当的最小值/平均值进行断言。您的第一步是将代码转换为小的、可重用的、有目的的方法。例如,检查main
方法末尾附近的这段代码:
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
double avg = 0.0;
for(int i = 0; i < vals.size(); i++)
{
avg += vals.get(i);
if(vals.get(i) < min)
min = vals.get(i);
if(vals.get(i) > max)
max = vals.get(i);
}
avg /= vals.size();
新方法定义为:
static Stats getStatsFromVals(List<Double> vals) {
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
double avg = 0.0;
for(double val : vals) {
avg += val;
if(val < min)
min = val;
if(val > max)
max = val;
}
avg /= vals.size();
return new Stats(min, max, avg);
}
正如评论中提到的,关键是让每个方法都将其参数作为输入,这样您就可以将控制台输入与应用程序逻辑分开。首先,将代码分解为小单元,即方法。您当前所能做的就是从JUnit调用
main()
,并一次性测试整个程序。测试一点只做一件事的程序比一次测试整个程序更容易。你的单元测试不应该关注通过控制台的用户输入。他们应该测试代码的计算部分。如果您将此代码重构为一个单独的类/方法,那么如何对其进行单元测试应该会变得更加清晰。
static Stats getStatsFromVals(List<Double> vals) {
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
double avg = 0.0;
for(double val : vals) {
avg += val;
if(val < min)
min = val;
if(val > max)
max = val;
}
avg /= vals.size();
return new Stats(min, max, avg);
}
@Test
public static void testGetStats() {
List<Double> testList = Arrays.asList("1.0, 2.0, 3.0");
Stats stats = MainClass.getStatsFromVals(testList);
assertEquals(1.0, stats.min);
assertEquals(3.0, stats.max);
assertEquals(2.0, Math.rint(stats.avg)); // risky FP math
}