В моем предыдущем посте я показал, как настроить полный проект на основе Maven для создания задания Hadoop в Java. Конечно, это не было завершено, потому что в нем отсутствует часть модульного тестирования. В этом посте я покажу, как добавить модульные тесты MapReduce в проект, который я начал ранее. Для модульного теста я использую фреймворк MRUnit .
- Добавьте необходимую зависимость в пом
Добавьте следующую зависимость в pom:
|
1
2
3
4
5
6
7
|
<dependency> <groupId>org.apache.mrunit</groupId> <artifactId>mrunit</artifactId> <version>1.0.0</version> <classifier>hadoop1</classifier> <scope>test</scope></dependency> |
Это сделало структуру MRunit доступной для проекта.
- Добавьте модульные тесты для тестирования логики Map Reduce
Использование этой структуры довольно просто, особенно в нашем случае. Поэтому я просто покажу код модульного теста и несколько комментариев, если это необходимо, но я думаю, что совершенно очевидно, как его использовать. Модульный тест для Mapper ‘MapperTest’:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package net.pascalalma.hadoop;import org.apache.hadoop.io.Text;import org.apache.hadoop.mrunit.mapreduce.MapDriver;import org.junit.Before;import org.junit.Test;import java.io.IOException;/** * Created with IntelliJ IDEA. * User: pascal */public class MapperTest { MapDriver<Text, Text, Text, Text> mapDriver; @Before public void setUp() { WordMapper mapper = new WordMapper(); mapDriver = MapDriver.newMapDriver(mapper); } @Test public void testMapper() throws IOException { mapDriver.withInput(new Text("a"), new Text("ein")); mapDriver.withInput(new Text("a"), new Text("zwei")); mapDriver.withInput(new Text("c"), new Text("drei")); mapDriver.withOutput(new Text("a"), new Text("ein")); mapDriver.withOutput(new Text("a"), new Text("zwei")); mapDriver.withOutput(new Text("c"), new Text("drei")); mapDriver.runTest(); }} |
Этот тестовый класс на самом деле даже проще, чем сама реализация Mapper. Вы просто определяете входные данные маппера и ожидаемый выходной сигнал, а затем позволяете настроенному MapDriver запустить тест. В нашем случае Mapper не делает ничего конкретного, но вы видите, как легко настроить тестовый сценарий. Для полноты вот тестовый класс Редуктора:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package net.pascalalma.hadoop;import org.apache.hadoop.io.Text;import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * Created with IntelliJ IDEA. * User: pascal */public class ReducerTest { ReduceDriver<Text, Text, Text, Text> reduceDriver; @Before public void setUp() { AllTranslationsReducer reducer = new AllTranslationsReducer(); reduceDriver = ReduceDriver.newReduceDriver(reducer); } @Test public void testReducer() throws IOException { List<Text> values = new ArrayList<Text>(); values.add(new Text("ein")); values.add(new Text("zwei")); reduceDriver.withInput(new Text("a"), values); reduceDriver.withOutput(new Text("a"), new Text("|ein|zwei")); reduceDriver.runTest(); }} |
- Запустите юнит-тесты
С помощью команды Maven «mvn clean test» мы можем запустить тесты:
С проведением модульных тестов я бы сказал, что мы готовы построить проект и развернуть его в кластере Hadoop, который я опишу в следующем посте.
