# integreation test（集成测试）

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/integration-tests.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/integration-tests.html)

译文链接 : [integreation test（集成测试）](/pages/viewpage.action?pageId=10027643)

贡献者 : 廖建博，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

## integration test （集成测试）

只有所有的运算集群都运行后，集成测试才能开始运行。和单元测试相比，集成测试花费的时间更多，但是集成测试基础结构通过仅重新开启整个集群试图将花费的时间最小化（如果配置已经确定了）。

如果您要进行集成测试，则您的测试类需要继承 ESIntegTestCase类。通过继承此类，您只需要确保至少有一定数量的节点启动，而不再需要在测试中手动启动弹性搜索节点。您通过在测试运行中指定不同的系统属性，完成大量的配置集成测试。 有关更多信息，请参阅源存储库中的  TESTING.asciidoc 。

## number of shards （碎片数）

集成测试期间，除非通过在创建索引时重写索引设置，否则索引创建的分片数量在1~10 之间随机生成。 除非一定需要，否则默认规则不会指定碎片数量，以便未来每次测试都将一直使用不同的分片。 或者，您可以重写 numberOfShards() 方法。 这方法同样适用于 numberOfReplicas()。

## generic helper methods （通用帮助方法）

ESIntegTestCase 中有几种帮助方法，这将使您的测试更简洁。

| `refresh()` | 刷新集群中的所有索引 |
| `ensureGreen()` | 确定集群状态处于绿色健康状态，等待搬迁。 默认等待30秒，30秒后，超时失败。 |
| `ensureYellow()` | 确定集群状态处于黄色健康状态，同样等待30秒，30秒后，超时失败。 |
| `createIndex(name)` | 创建具有指定名称的索引 |
| `flush()` | 刷新集群中的所有索引 |
| `flushAndRefresh()` | 集合 flush（）和 refresh（）调用 |
| `forceMerge()` | 等待所有的迁移完成，并强制将集群中的所有索引合并到一个段。 |
| `indexExists(name)` | 检查给定索引是否存在 |
| `admin()` | 返回用于管理任务的AdminClient |
| `clusterService()` | 返回集群服务java类 |
| `cluster()` | 返回测试集群类，这将在下一段中进行说明 |

## test cluster methods （集群测试方法）

InternalTestCluster 类是随机测试中集群功能的核心功能，并允许您配置特定设置或重播某些类型的中断，以检查自定义代码的运行反应。

| `ensureAtLeastNumNodes(n)` | 确保集群中最少运行n个节点 |
| `ensureAtMostNumNodes(n)` | 确保集群中最多运行n个节点 |
| `getInstance()` | 从指定节点中获取一个 guice 类实例化实例 |
| `getInstanceFromNode()` | 从随机节点中获取一个 guice 类实例化实例 |
| `stopRandomNode()` | 随机停止集群中的节点以模拟中断 |
| `stopCurrentMasterNode()` | 停止当前主节点，并强制选择新的主节点 |
| `stopRandomNonMaster()` | 随机停止集群中的非主节点以模拟中断 |
| `buildNode()` | 创建一个新的 elasticsearch 节点 |
| `startNode(settings)` | 创建并开始一个新的 elasticsearch 节点 |

## changing node settings（改变节点设置）

如果要确保节点的一定配置，让它们作为EsIntegTestCase的一部分启动，，您可以重写nodeSettings（）方法

**changing node setting**

```
public class Mytests extends ESIntegTestCase {
 	@Override 
	protected Settings nodeSettings(int nodeOrdinal) { 
		return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put("node.mode", "network").build(); 
	} 
```

## Accessing clients （访问客户端）

为了执行任何操作，您需要使用客户端。您可以使用 ESIntegTestCase.client（）方法来获取随机客户机。该客户端可以是 TransportClient 或 NodeClient，通常只要程序开始执行后就无需过多关心。 在InternalTestCluster类中有多种客户端选择方法，可以使用ESIntegTestCase.internalCluster（）方法对其进行使用。

| `iterator()` | 所有可用客户端上的迭代器 |
| `masterClient()` | 返回连接到主节点的客户端 |
| `nonMasterClient()` | 返回未连接到主节点的客户端 |
| `clientNodeClient()` | 返回在客户机节点运行的客户端 |
| `client(String nodeName)` | 将客户端返回给指定节点 |
| `smartClient()` | 智能返回客户端 |

## Scoping（范围）

在默认情况下，每个测试组件都使用唯一的集群进行测试。在每一个的测试中都删除了他们之间的索引和模板。然而有些时候，您需要为每个测试启动一个新的集群——比如：您想加载某个插件，而不想在每一个测试中加载它。

您可以在类级别上使用 @ClusterScope 注释来配置此行为。

**Scoping**

```
@ClusterScope(scope=TEST, numDataNodes=1) 
public class CustomSuggesterSearchTests extends ESIntegTestCase {
	 // ... tests go here 
}
```

上述例子为每个测试方法进行配置，配置内容为在测试中使用新的集群。默认范围是 SUITE （测试方法中所有方法的一个集群）。numDataNodes设置允许您只启动一定数量的数据节点，这可以加速测试执行，因为启动新节点是一项费用高昂且耗时的操作，可能不需要此测试。

默认情况下，测试基本结构将随机启动指定主节点。如果要禁用指定主节点，可以用与numDataNodes 类似的设置方式设置 supportsDedicatedMasters = false。如果不使用指定主节点，普通数据节点也将被允许成为主节点。

## Changing plugins via configuration（通过配置更改插件）

当 elasticsearch 使用 JUnit 4 时，使用 @Before 和 @After 注释时是没有问题的。然而，您应该记住，这点在集群设置中没有任何影响，因为当运行这些方法时，集群已经处于启动并运行的状态。所以，您如果想在节点运行前配置这些设置，如：在节点启动前载入插件，您应该重写 ESIntegCase这个类中的nodePlugins() 方法，并返回每个节点应加载的插件类。

**Changing plugins via configuration**

```
@Override
protected Collection<Class<? extends Plugin>> nodePlugins() {
  return Arrays.asList(CustomSuggesterPlugin.class);
}

```