WordCount测试项目小结

一、本文对应项目GitHub地址

https://github.com/ReWr1te/WCProject
请参照最新版本(WCProject4.0)

二、项目PSP表格

PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)
Planning计划510
· Estimate· 估计这个任务需要多少时间510
Development开发355600
· Analysis· 需求分析 (包括学习新技术)50100
· Design Spec· 生成设计文档1010
· Design Review· 设计复审 (和同事审核设计文档)2550
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1020
· Design· 具体设计100100
· Coding· 具体编码100200
· Code Review· 代码复审1020
· Test· 测试(自我测试,修改代码,提交修改)50100
Reporting报告4040
· Test Report· 测试报告2525
· Size Measurement· 计算工作量55
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划1010
合计400650

三、简单解题思路

  1. 需求分析:仔细阅读给出需求并细化,重新陈述以及思考解决难度;
  2. 设计文档:基本设计思路整理;
  3. 制定代码规范:根据指定的语言(Java)指定相关规范;
  4. 具体设计:核心算法设计,6个功能主要分为6部分,同时注意衔接;
  5. 具体编码;
  6. 代码复审:经验排错;
  7. 测试:撰写测试用例并完善,同时修改代码以提高质量;
  8. 总结和撰写报告;

四、程序设计实现流程

本项目Java代码只有一个wc类,4个函数:

  1. 主函数:包含核心算法流程和输出类测试用例;
  2. getFile()函数:递归获取当前文件夹内所有文件(排除文件夹);
  3. chars()函数:计算字符数;
  4. words()函数:计算单词数;
    主函数调用其余函数完成功能,部分功能在主函数内单独实现。

五、代码说明

Java类代码分为主函数和几个功能函数,但是并非所有功能都在功能函数里面实现。具体核心代码及说明参见以下代码和注释(更加详细的解释等待补充):

// 计算字符数

public static int chars(String str) {
    char[] charArray = str.toCharArray();
    int c_num = 0;
    for (int i = 0; i < charArray.length; i++)
    {
        c_num++;
    }
    return c_num;
}

// 计算单词数

public static int words(String str) {
    char[] charArray = str.toCharArray();
    int w_num = 0;
    for (int i = 0; i < charArray.length; i++)
    {
        if (charArray[i] == ' ' || charArray[i] == ',' || charArray[i] == '\n')
        {
            w_num++;
            if (charArray[i] == ' ' && charArray[i - 1] == ',')
                w_num--;
            if (charArray[i] == '\n' && 
                (charArray[i - 1] == '\n' || 
                    charArray[i - 1] == '{' || charArray[i - 1] == '}'))
                w_num--;
        }
    }
    return w_num;
}

// 得到当前目录内所有文件(本程序中并没有使用这个方法遍历文件,但是这个方法证实可行)

public static void getFile(File file) {
    File[] files = file.listFiles();
    for (File a:files) {
        if (!a.isDirectory())
            arr_files.add(a.getAbsolutePath());
        else
            getFile(a);
    }
}

// 参数判断

for (int i = 0; i < args.length; i++)
{
    if (args[i].indexOf(".") != -1)
    {
        if (args[i - 1].indexOf(".") != -1)
        {
            arr_inputs.add(args[i]);
            allfile = i;
            file_count++;
        }
        else if (args[i].indexOf("stopList.txt") != -1)
            exclude = i;
        else if (input == -1)
        {
            arr_inputs.add(args[i]);
            input = i;
            file_count++;
        }
        else
            output = i;
    }
    if (file_count >= 2)
        allfile = 1;
}

// stopList扣词

for (int i = 0; i < args.length; i++)
{
    //System.out.println(args[i]);
    if (args[i].equals(str_e))
    {
        if (exclude == -1)
        {
            System.out.println("\n不能单独使用-e参数!\n");
            out = false;
        }
        else
        {
            String[] strArray = str_read.split(" ");
            String tempStr = e_sb.toString();
            String[] e_str = tempStr.split(" ");
            for (int j = 0; j < strArray.length; j++)
            {
                for (int k = 0; k < e_str.length; k++)
                {
                    //System.out.println(strArray[j] + e_str[k]);
                    if (strArray[j].indexOf(e_str[k]) != -1)
                        w_num--;
                }

            }
        }
    }
}

// 输出准备+测试用例

for (int i = 0; i < args.length; i++)
{
    if (args[i].equals(str_c))
    {
        // System.out.println("\n字符数:" + c_num);
        str_output = str_output + this_file + "," 
        + "字符数:" + c_num + "\r\n";
    }
    if (args[i].equals(str_w))
    {
        // System.out.println("\n单词数:" + w_num);
        str_output = str_output + this_file + ", " 
        + "单词数:" + w_num + "\r\n";
    }
    if (args[i].equals(str_l))
    {
        // System.out.println("\n行数: " + line);
        str_output = str_output + this_file + "," 
        + "行数:" + line + "\r\n";
    }
    if (args[i].equals(str_o))
    {
        if (output == -1)
        {
            System.out.println("\n不能单独使用-o参数!\n");
            out = false;
        }
        else
            filename = args[output];
    }
    if (args[i].equals(str_a))
    {
        // System.out.println("\n代码行/空行/注释行:" 
        //     + line_code + "/" 
        //     + line_null + "/" + line_comment);
        str_output = str_output + this_file + "," 
            + "代码行/空行/注释行: " + line_code + "/" 
            + line_null + "/" + line_comment + "\r\n";
    }
}

// 输出(若没有指定文件名则输出到result.txt,若没有文件则创建文件)

if (out == true)
{
    File file = new File(filename);
    if (!file.exists())
        file.createNewFile();
    FileWriter fileWriter = new FileWriter(file.getName(), true);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write(str_output);
    bufferedWriter.close();
}

改进之后能够在.exe文件形式下处理一般通配符:

// 得到当前目录内所有文件

public static void getFiles(File file) {
    File[] files = file.listFiles();
    for (File a:files) {
        if (!a.isDirectory())
            arr_files.add(a.getName());
        else
            getFiles(a);
    }
}

//参数判断

for (int i = 0; i < args.length; i++) {
    if (args[i].indexOf(".") != -1) {
        if (args[i].indexOf("*.") != -1) {
            type = args[i].replace("*", "");
            allfile = i;
        }
        else if (args[i].indexOf("stopList.txt") != -1)
            exclude = i;
        else if (input == -1)
            input = i;
        else
            output = i;
    }
}

六、测试设计

本来的思路是按照白盒测试设计各个路径的测试用例,但是实际上因为程序比较简单,所以最后应该是黑盒测试的设计思路,尽量覆盖所有功能:

(功能衔接处会有高风险,多设计两个测试用例)

  1. wc.exe -c -w -l test1.cpp
    同时测试-c -w -l三个基础的功能
  2. wc.exe -c -w -l test2.c
    在用例1的基础上改变文件类型
  3. wc.exe -c -w -l -a test1.cpp
    在用例1的基础上添加-a参数,测试输出行类型信息
  4. wc.exe -c -w -l -a test2.c -e stopList.txt
    在用例3的基础上添加-e参数,测试停用词表
  5. wc.exe -c -w -l -a test2.c -o outputFile.txt
    在用例3的基础上添加-o参数,测试指定输出文件的功能
  6. wc.exe -c -w -l -a test2.c -e stopList.txt -o outputFile.txt
    在用例3的基础上添加-e和-o参数,同时测试停用词表和指定输出文件功能
  7. wc.exe -s *.cpp
    测试-s参数,处理多个文件的功能
  8. wc.exe -s *.c
    在用例8的基础上改变输入文件的类型
  9. wc.exe -c -w -l -a -s *.cpp -e stopList.txt -o outputFile.txt
    结合测试用例6,7,同时处理基础功能,行类型信息,多文件,停用词表和指定输出文件名
  10. wc.exe -c -w -l -a test1.cpp test2.c -e stopList.txt -o outputFile.txt
    在用例9的基础上改变多文件处理的类型

    七、参考文献

本次项目无参考文献。

转载于:https://www.cnblogs.com/ShiyuanTian/p/8613462.html

### 回答1: 创建基于Scala语言的Spark Maven项目: 1. 打开IntelliJ IDEA,点击“Create New Project”。 2. 选择“Maven”作为项目类型,点击“Next”。 3. 输入项目名称和项目路径,点击“Next”。 4. 选择Scala版本和Spark版本,点击“Next”。 5. 选择项目的groupId和artifactId,点击“Next”。 6. 点击“Finish”完成项目创建。 WordCount程序: 1. 在src/main/scala目录下创建一个WordCount.scala文件。 2. 在文件中输入以下代码: ``` import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("WordCount").setMaster("local") val sc = new SparkContext(conf) val input = sc.textFile("input.txt") val words = input.flatMap(line => line.split(" ")) val counts = words.map(word => (word, 1)).reduceByKey(_ + _) counts.foreach(println) } } ``` 3. 在项目根目录下创建一个input.txt文件,并输入一些文本内容。 4. 运行WordCount程序,可以在控制台看到单词统计结果。 ### 回答2: 在创建基于Scala语言的Spark Maven项目及WordCount应用之前,需要先安装以下软件: 1. Java JDK 2. Scala 3. Apache Maven 4. Apache Spark 接下来,按照以下步骤创建项目: 1. 打开终端并创建一个新目录,用于存储Spark项目。 ``` mkdir spark-project cd spark-project ``` 2. 创建一个新的Maven项目,使用以下命令: ``` mvn archetype:generate -DgroupId=com.sparkproject -DartifactId=wordcount -DarchetypeArtifactId=maven-archetype-quickstart -DscalaVersion=2.11.7 ``` 这个命令会使用Maven的Quickstart模板创建一个基本的Maven项目。在此过程中,你需要输入要创建的组ID、项目ID和Scala版本。 3. 打开pom.xml文件并添加Spark依赖库。 ``` <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> ``` 这个依赖库将帮助我们在Maven项目中导入Spark库。 4. 创建一个新的Scala源代码文件WordCount.scala。 ``` package com.sparkproject import org.apache.spark._ import org.apache.spark.SparkContext._ object WordCount { def main(args: Array[String]) { val conf = new SparkConf().setAppName("WordCount") val sc = new SparkContext(conf) val textFile = sc.textFile(args(0)) val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile(args(1)) } } ``` 这个代码将使用Spark来计算文本文件中单词的出现次数。它主要使用了Spark的RDD(Resilient Distributed Datasets)API。 5. 使用以下命令将Maven项目打包: ``` mvn package ``` 6. 使用以下命令在Spark集群上运行WordCount应用程序。 ``` ../bin/spark-submit --class "com.sparkproject.WordCount" --master local wordcount-1.0-SNAPSHOT.jar /path/to/input/files /path/to/output/directory ``` 这个命令将使用Spark的`spark-submit`命令启动WordCount应用程序。其中,`/path/to/input/files`是要处理的文本文件路径,`/path/to/output/directory`是将缓存结果输出的目录路径。 总结: 通过上述步骤,我们创建了一个基于Scala语言的Spark Maven项目,并构建了一个WordCount应用程序来演示如何使用Spark来处理文本数据。这个示例代码可用于提供Spark在更复杂数据分析场景下的能力。 ### 回答3: Apache Spark是一个开源的大数据处理框架,它使用分布式计算的方式实现高效的数据处理,支持多种语言,其中Scala是最为常用的语言之一。Maven是一个流行的构建工具,提供了一种简单的方式管理项目的依赖,方便项目管理和部署。在本文中,我们将介绍如何使用Scala和Maven创建一个Spark Maven项目并实现一个简单的WordCount程序。 首先,我们需要安装Scala和Maven。如果您已经安装并配置好了,可以跳过这一步骤。首先安装Scala,可以到Scala的官网下载安装包,也可以使用命令行安装。安装完成后,需要确认是否正确地配置了系统的环境变量。 然后安装Maven。可以从Maven的官网下载安装包,也可以使用命令行安装。安装完成后同样需要确认是否正确地配置了系统的环境变量。 接下来,我们开始创建一个Maven项目。首先打开命令行窗口,使用以下命令创建一个基于Scala的Spark Maven项目: ``` mvn archetype:generate -DgroupId=com.spark.scala -DartifactId=wordcount -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=local ``` 该命令将创建一个名为“wordcount”的Maven项目,在项目的根目录中,有一个包含Java代码的src/main/java目录,和一个包含测试代码的src/test/java目录。 接下来,我们需要在项目的pom.xml文件中添加Spark和Scala的依赖。在pom.xml文件中,添加以下代码: ``` <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.11.12</version> </dependency> </dependencies> ``` 此时我们已经创建好了一个基于Scala的Spark Maven项目,接下来我们实现一个简单的WordCount程序。 首先,在src/main/scala目录中创建一个名为“WordCount”的Scala文件,添加以下代码: ``` import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]) { val conf = new SparkConf() .setAppName("WordCount") .setMaster("local[2]") val sc = new SparkContext(conf) val input = sc.textFile(args(0)) val words = input.flatMap(line => line.split(" ")) val counts = words.map(word => (word, 1)).reduceByKey(_ + _) counts.saveAsTextFile(args(1)) sc.stop() } } ``` 该程序使用Spark的API,首先创建了一个SparkConf对象和一个SparkContext对象,设置了应用程序的名称和运行模式。然后使用textFile方法从输入文件中读取数据,使用flatMap方法将每一行数据解析成单词,再使用map和reduceByKey方法计算单词的出现频率。最后使用saveAsTextFile方法将结果保存到输出文件中,并关闭SparkContext。 接下来,我们在命令行中运行该程序。首先将文本文件(例如input.txt)复制到项目的根目录中,然后使用以下命令运行程序: ``` mvn exec:java -Dexec.mainClass="WordCount" -Dexec.args="input.txt output" ``` 此时程序将输出结果保存在output目录中。 综上所述,我们使用Scala和Maven创建了一个基于Spark的Maven项目,并实现了一个简单的WordCount程序。这个过程中,对于初学者来说可能存在一些困难,但随着对Spark和Scala的深入了解,这些问题都可以轻松解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值