【问题标题】:Text report testing with Java application使用 Java 应用程序进行文本报告测试
【发布时间】:2016-09-27 09:36:28
【问题描述】:

我正在处理一个项目,我必须检查从系统生成的一些 (500) 报告是否通过或失败。

我面临两个问题。

  1. 文本解析。每份报告都是独一无二的,并且有不同的格式。

报告示例:

门票销售

电影 Full_seats 销售 Empty_seats

电影 1 星期一 100 500 20

星期二 120 600 0

星期三 80 400 40

星期四 100 500 20

星期五 100 500 20

电影 2

星期一 100 500 20

星期二 120 600 0

星期三 80 400 40

星期四 100 500 20

星期五 100 500 20

等等……

报告结束。

我可以做些什么来映射报告中的值,并将它们保存到 java 集合中。有没有更聪明的方法来创建 500 种不同的解析方法?

  1. 将报告与应用程序中的信息进行比较。我想为每个报告都有一个配置文件,并在其中编写我需要从应用程序中比较的内容。例如:

report.grossSales & sales.getDay(18_9_2016).grossSales();

以上将意味着自动化运行:

if(report.grossSales != sales.getDay(18_9_2016).grossSales()){
  System.out.print("failed");
}

请随意提出其他更聪明、更灵活的方法。 谢谢

【问题讨论】:

  • 这些输入是定义的还是任意行?
  • 生成报告的系统和我的应用具有相同的输入(票证)

标签: java parsing reporting text-parsing


【解决方案1】:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReadFile {
  public static void main(String[]args) throws IOException{

      FileReader in = new FileReader("C:/test.txt");
      BufferedReader br = new BufferedReader(in);
      String line = "";
      String wholeReportText="";
      while ((line = br.readLine()) != null) {
         wholeReportText += line;
      }
      in.close();

           Pattern pattern = Pattern.compile("Movies(.*?)");
           Matcher matcher = pattern.matcher(wholeReportText);
           // check all occurance
           while (matcher.find()) {
                   System.out.println(matcher.group(1));
           }

      Pattern daypat = Pattern.compile("Tuesday (.*?)");
      Matcher daymat = daypat.matcher(wholeReportText);
      // check all occurance
      while (daymat.find()) {
            System.out.println(matcher.group(1));
      }


  }
}

您的问题需要像算法一样分解为子问题

步骤 1) 列出您需要解析的所有文件 (File API in java NIO 中的 java FileFilter 和 java7 中的 Paths API)

步骤2)从文件中一一读取和提取数据(示例代码 以上)

Step 3) 将提取的数据存储在一些HashMap或ArrayList中

第 4 步)根据您的要求使用集合

【讨论】:

    【解决方案2】:

    如果我理解正确,您的任务是验证报告文件是否生成并正确保存。 在这种情况下,我不会让您的自动化应用程序复杂化。 您可能有权访问生成报告文件的算法/模板。 因此可以在内存中生成报告,然后可以使用文件中的内容轻松验证其内容。

    【讨论】:

    • 我无权访问模板或数据库。我在我的应用程序和普通系统中拥有相同的输入(票证)。然后我从系统获取报告,我必须针对应用程序对其进行测试..
    【解决方案3】:

    您可以为每种类型的票创建不同的解析机制。例如,你可以有接口:

    interface Ticket {
        void create(String rawTicket);
        Double getSales();
    }
    

    以及所有类型票证的不同实现,例如:

    class DayTicket implements Ticket{
    
        @Override
        public void create(String rawTicket) {
            //parse raw ticket, for example, "Monday 10 10 10"
        }
    
        @Override
        public Double getSales() {
            return null;
        }
    }
    

    然后在输入时,您可以为每种类型的工单提供正则表达式模式并迭代所有这些模式以找到匹配的工单实现,然后可以获取原始文本并将其解析为有意义的对象:

    //Matches Wednesday 80 400 40
    Pattern DAY_TICKET = Pattern.compile("^\\w+day\\s\\d+\\s\\d+(\\s\\d+)?$");
    
    Ticket createTicket(String raw) {
        if (DAY_TICKET.matcher(raw).matches()) {
            Ticket dayTicket = new DayTicket();
            dayTicket.create(raw);
            return dayTicket;
        }
        //etc
    }
    

    关于你提到的 500 种不同的解析方法——例如,你只需要一种,

    Tuesday 120 600 0
    
    Wednesday 80 400 40
    

    星期四 100 500 20

    星期五 100 500 20

    以同样的方式提取日期和金额

    【讨论】:

    • 是的,如果报告相同,我将重用解析。感谢使用该模式的解决方案,您对配置文件有什么想法以及如何实现它吗?所以我例如,从报告中读取门票,然后我想说“门票价格”检查“来自应用程序的价值”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多