Java从文本读取数据:
BufferedReader in=new BufferedReader(
new InputStreamReader(//Stream(流)与Reader之间的桥梁
new FileInputStream("要读取的文件路径")));//只能处理字节流;文件路径可以是相对路径和绝对路径
或者
BufferedReader in = new BufferedReader(new FileReader("文件路径"));
上面的新建的 BufferedReader 对象 in 可以通过如下代码读取文本的数据显示到控制台:
String line;
while((line=in.readLine())!=null){//readLine()方法是从文本中读取一行,并指向下一行
System.out.println(line);
}
向文本中写入数据:
PrintWriter out=new PrintWriter(
new BufferedWriter(//一个缓冲
new OutputStreamWriter(
new FileOutputStream("要写入的文件路径"))));
上面 PrintWriter 对象可以通过以下方法向文本写入内容
- format(“格式”,…);
- printf(“格式”,…);
- print(各种基本类型);
- println(各种基本类型);
下面是学习软件测试时一个驱动设计的例子,实现自动从文本中读取数据进行测试,并将测试结果写入另一个文本中。
问题描述:
根据不同的消费金额,给予不同的折扣优惠,具体折扣优惠规则如下:
(1)当账单一次消费金额为负数或者为零时,返回负数表示消费无效。
(2)当账单一次消费金额在800到1800元之间时(不含800,但包含1800元),折扣为9折。
(3)当账单一次消费金额在1800到4800(含)之间时,为8折。
(4)当账单一次消费金额在4800以上时,一律为7折。
实现以上功能的类Discount:
public class Discount {
public double calculateDiscount(double amount){
if(amount<=0) return -1;
if(amount>800 && amount<=1800) return amount*0.9;
if(amount>1800 && amount<=4800) return amount*0.8;
if(amount>4800) return amount*0.7;
return amount;
}
}
给出的测试用例文本DiscountData.txt:
1 400.0 400.0
2 1300.0 1170.0
3 3300.0 2640.0
4 8000.0 5600.0
5 0.0 -1.0
6 1.0 1.0
7 799.0 799.0
8 800.0 800.0
9 801.0 720.9
10 1799.0 1619.1
11 1800.0 1620.0
12 1801.0 1440.8
13 4799.0 3839.20
14 4800.0 3840.0
15 4801.0 3360.7
16 -1.0 -1.0
17 -10.0 -1.0
设计的驱动程序DriverDiscount:
import java.io.*;
public class DriverDiscount {
public static void main(String[] args) {
Discount discount=new Discount();
int passNum=0;
int failNum=0;
try{
//创建读对象
BufferedReader in=new BufferedReader(
new InputStreamReader(
new FileInputStream("src/DiscountData.txt")));
//创建写对象
PrintWriter out=new PrintWriter(
new BufferedWriter(//一个缓冲
new OutputStreamWriter(
new FileOutputStream("src/testResult.txt"))));
String linetxt=null;
int row=0;
out.println("*******这是通过DiscountData.txt测试数据对Discount类的测试结果*******");
while((linetxt=in.readLine())!=null){
row++;
//将读到的每一行数据以空格为分隔符划分成字符串数组(编号 输入数据 预期输出)
String data[]=linetxt.split(" ");
double input=Double.parseDouble(data[1]);
double expectedOut=Double.parseDouble(data[2]);
double actualOut=discount.calculateDiscount(input);
if(Math.abs(actualOut-expectedOut)<1e-6){
//只要实际输出与预期输出在1e-6误差范围内,则测试通过
passNum++;
out.println("测试用例"+row+": pass");
}else{
failNum++;
out.println("测试用例"+row+": fail");
}
}
out.println("共执行"+row+"个测试用例,其中"+passNum+"个通过,"+failNum+"个失败");
in.close();
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
得到的执行结果文本testResult.txt:
*******这是通过DiscountData.txt测试数据对Discount类的测试结果*******
测试用例1: pass
测试用例2: pass
测试用例3: pass
测试用例4: pass
测试用例5: pass
测试用例6: pass
测试用例7: pass
测试用例8: pass
测试用例9: pass
测试用例10: pass
测试用例11: pass
测试用例12: pass
测试用例13: pass
测试用例14: pass
测试用例15: pass
测试用例16: pass
测试用例17: pass
共执行17个测试用例,其中17个通过,0个失败