zoukankan      html  css  js  c++  java
  • 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0、preliminary 环境搭建

    Setup development environment

    Download the latest version of MRUnit jar from Apache website: https://repository.apache.org/content/repositories/releases/org/apache/mrunit/mrunit/. For example if you are using the Hadoop version 1.0.3, download mrunit-x.x.x-incubating-hadoop2.jar.
    Include the jar in your IDE classpath. Also download the latest verison of mokito (http://code.google.com/p/mockito/) and JUnit jar and add them to your class path of development environment.
    请导入jar包到CentOS中的eclipse

    download site: https://mrunit.apache.org/general/downloads.html
    这里写图片描述

    download web site https://repository.apache.org/content/repositories/releases/org/apache/mrunit/mrunit/1.1.0/
    这里写图片描述
    这里写图片描述

    You should Attention:

    hadoop 框架包里面有自带的mock jar包,吧他们全部删除,否则要产生jar包兼容性异常(编译器不晓得调哪个jar包为好)


    转自: http://www.infoq.com/cn/articles/HadoopMRUnit

    (请关心里面的干货——测试用例文末)

    引言

    Hadoop MapReduce作业有着独一无二的代码架构,这种代码架构拥有特定的模板和结构。这样的架构会给测试驱动开发和单元测试带来一些麻烦。这篇文章是运用MRUnit,Mockito和PowerMock的真实范例。

    我会介绍

    使用MRUnit来编写Hadoop MapReduce应用程序的JUnit测试
    使用PowerMock和Mockito模拟静态方法
    模拟其他类型中的业务逻辑(译注:也就是编写测试驱动模块)
    查看模拟的业务逻辑是否被调用(译注:测试驱动模块是否运行正常)
    计数器
    测试用例与log4j的集成
    异常处理

    本文的前提是读者应该已经熟悉JUnit 4的使用。

    使用MRUnit可以把测试桩输入到mapper和/或reducer中,然后在JUnit环境中判断是否通过测试。这个过程和任何JUnit测试一样,你可以调试你的代码。MRUnit中的MapReduce Driver可以测试一组Map/Reduce或者Combiner。 PipelineMapReduceDriver可以测试Map/Reduce作业工作流。目前,MRUnit还没有Partitioner对应的驱动。MRUnit使开发人员在面对Hadoop特殊的架构的时候也能进行TDD和轻量级的单元测试。

    测试用例(MapTest + ReduceTest + MapReduceTest)

    publicclass MapTest {

    private Mapper mapper;
    private MapDriver driver;
    
    @Before
    publicvoid init(){
        mapper = new WordCount.Map();
        driver = new MapDriver(mapper);
    }
    
    @Test
    publicvoid test() throws IOException{
        String line = "this is a test case for map";
        driver.withInput(new LongWritable(1),new Text(line))
                .withOutput(new Text("this"), new IntWritable(1))
                .withOutput(new Text("is"), new IntWritable(1))
                .withOutput(new Text("a"), new IntWritable(1))
                .withOutput(new Text("test"), new IntWritable(1))
                .withOutput(new Text("case"), new IntWritable(1))
                .withOutput(new Text("for"), new IntWritable(1))
                .withOutput(new Text("map"), new IntWritable(1))
                .runTest();
    }
    

    }

    publicclass ReduceTest {

    private Reducer reducer;
    private ReduceDriver driver;
    
    @Before
    publicvoid init(){
        reducer = new WordCount.Reduce();
        driver = new ReduceDriver(reducer);
    
    }
    @Test
    publicvoid test() throws IOException{
        String key = "test";
        List<IntWritable> values = new ArrayList();
        values.add(new IntWritable(2));
        values.add(new IntWritable(3));//5        
        driver.withInput(new Text(key),values)
                .withOutput(new Text("test"), new IntWritable(5))
                .runTest();
    }
    

    }

    publicclass MapReduceTest {

    private Reducer reducer;
    private Mapper mapper;    
    private MapReduceDriver driver;
    
    @Before
    publicvoid init(){
        reducer = new WordCount.Reduce();
        mapper = new WordCount.Map();
        driver = new MapReduceDriver(mapper,reducer);
    }
    @Test
    publicvoid test() throws IOException{
        String line = "chinacache is a great CDN is it not";
        driver.withInput(new LongWritable(1),new Text(line))
                .withOutput(new Text("CDN"), new IntWritable(1))
                .withOutput(new Text("a"), new IntWritable(1))
                .withOutput(new Text("chinacache"), new IntWritable(1))
                .withOutput(new Text("great"), new IntWritable(1))
                .withOutput(new Text("is"), new IntWritable(2))
                .withOutput(new Text("it"), new IntWritable(1))
                .withOutput(new Text("not"), new IntWritable(1))
                .runTest();
    }
    

    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    中国科学院2021年硕转博考试分析试题参考解答
    蒲和平大学生数学竞赛教程答案5.1.3
    清华大学2021年数学推荐免试试题参考解答
    蒲和平大学生数学竞赛教程答案4.1.1
    兰州大学历年数学分析高等代数考研试题答案
    复旦大学2021年数学英才实验班选拔考试试题参考解答pdf
    北京大学2021年基础学科招生考试数学试题
    南开大学2021年数学伯苓班/复旦大学2021年数学英才实验班选拔考试试题
    实变函数与泛函分析第05次课:至1.5.2(请点阅读全文进课堂)
    中国科学技术大学2021年新生入学考试试题
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893182.html
Copyright © 2011-2022 走看看