elasticsearch2.1.1集成测试中遇到的问题总结

从elasticsearch1.6.2版本开始,项目组就开始进行基于elasticsearch的应用开发,然而对于这些应用的单元测试则相对落后——在搭建的es测试集群上跑测试用例。其实,es本身提供了易于使用地基础的集成测试能力。在开始es功能的集成测试前,建议阅读es测试官方文档
项目使用的版本是2.1.1,下面遇到的问题都是针对此版本的。

1.elasticsearch中的jarHell问题

解决方案是在测试源码目录src/test/java中添加org.elasticsearch.bootstrap.JarHell类,源码如下:

package org.elasticsearch.bootstrap;
import java.net.URL;
public class JarHell {
    private JarHell() {}
    public static void checkJarHell() throws Exception {}
    public static void checkJarHell(URL urls[]) throws Exception {}
    public static void checkVersionFormat(String targetVersion) {}
    public static void checkJavaVersion(String resource, String targetVersion) {}
    public static URL[] parseClassPath() {return new URL[]{};}
}

参考目录:解决es2.1.1中jarHell问题

2.和EasyMock集成问题

进行单元测试时,经常使用mock对象,项目中主要使用的是EasyMockPowerMock
如果测试类是继承自ESIntegTestCase进行继承测试时,要注意,如果使用@Before或者@After标识,则参考LuceneTestCase类中关于此的描述

 * For instance-level setup, use {@link Before} and {@link After} annotated
 * methods. If you override either {@link #setUp()} or {@link #tearDown()} in
 * your subclass, make sure you call <code>super.setUp()</code> and
 * <code>super.tearDown()</code>. This is detected and enforced.

3.设置elasticsearch集群实例的shard和replica数

对于shard个数和备份个数的设置,要重载方法。

@Override
protected int numberOfShards() {
return 1;
}

@Override
protected int numberOfReplicas() {
return 0;
}

参考number of shards

4.给出elasticsearch集成测试的小例子

public class Alias {

    private AliasType aliasType;
    private MGIndex current;

    public Alias(AliasType aliasType) {
        this.aliasType = aliasType;
        current = MGIndexFactory.get(aliasType.getPrefix());
    }

    //对于每个shard设置界限值
    public boolean isNeedAdd(Client client) throws ClusterUnhealthException {
        // Check shard doc
        String index = current.getIndexName();
        IndicesStatsResponse stats = client.admin().indices().prepareStats(index).execute().actionGet();
        if (stats.getFailedShards() > 0) {
            throw new ClusterUnhealthException("Get shards stats failed");
        }

        int docThreshold = current.getDocThreshold();

        for (ShardStats st : stats.getShards()) {
            String info = String.format("%s contains %d files which's threshold is %d", index,
                            st.getStats().getDocs().getCount(), docThreshold);
            MGLogger.info(info);

            if (st.getStats().getDocs().getCount() > docThreshold)
                return true;
        }

        return false;
    }
}

其测试函数如下:

public class AliasTest extends ESIntegTestCase{
    Alias alias = null;

    @Before
    public void setUp() throws Exception {
        super.setUp();
        alias = new Alias(AliasType.ATTACHMENT);
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Override
    protected int numberOfShards() {
        return 1;
    }

    @Override
    protected int numberOfReplicas() {
        return 0;
    }

    @Test
    public void testIsNeedAdd() throws Exception {
        indexRandom(true, false,
            client().prepareIndex("test", "type1", "1").setSource("field1", "王宁"),
            client().prepareIndex("test", "type1", "2").setSource("field1", "个人电话"),
            client().prepareIndex("test", "type1", "3").setSource("field1", "12")
        );

        refresh();
        MGIndex mgIndexMock = EasyMock.createMock(MGIndex.class);
        EasyMock.expect(mgIndexMock.getIndexName()).andReturn("test").times(2);
        EasyMock.expect(mgIndexMock.getDocThreshold()).andReturn(5).times(2);
        EasyMock.replay(mgIndexMock);
        alias.setCurrent(mgIndexMock);

        assertFalse(alias.isNeedAdd(client()));

        indexRandom(true, false,
            client().prepareIndex("test", "type1", "4").setSource("field1", "王宁"),
            client().prepareIndex("test", "type1", "5").setSource("field1", "个人电话"),
            client().prepareIndex("test", "type1", "6").setSource("field1", "12")
        );

        assertTrue(alias.isNeedAdd(client()));

        EasyMock.verify(mgIndexMock);
    }
}

测试用例AliasTest中,使用EasyMock来mock current对象,通过继承ESIntegTestCase来进行es功能的集成测试——构筑一个只有一个shard无备份的集群,shard中文档的个数大于5时,使得isNeedAdd的返回值为空。

5.PowerMock和ESIntegTestCase配合产生的问题

由于ESIntegTestCase的祖先LuceneTestCase使用@RunWith(RandomizedRunner.class)和PowerMock在mock static函数时,使用的@RunWith(PowerMockRunner.class)冲突,使用这种方法无法将es的集成测试和PowerMock mock static 函数的能力结合在一起,尝试了Bootstrap using a Junit RuleDelegate to another JUnit Runner仍没解决ESIntegTestCase和PowerMock融合的问题,记录留待解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容