anchor.diff:  -----------------------------------------
   
   [[randomized-testing]]
  -=== Randomized testing
  -
  -The code snippets you saw so far did not show any trace of randomized testing features, as they are carefully hidden under the hood. However when you are writing your own tests, you should make use of these features as well. Before starting with that, you should know, how to repeat a failed test with the same setup, how it failed. Luckily this is quite easy, as the whole mvn call is logged together with failed tests, which means you can simply copy and paste that line and run the test.
  -
  +=== 随机测试
  +
  +目前为止，你看到的代码片段并没有体现出随机测试的任何特性，那是因为这些细节被小心的被隐藏在底层了。然而，在你写自己的测试用例时，你也应该使用这些特性。在开始之前，你需要知道，如何重现一个失败的测试用例，它是如何失败的。幸运的是，这特别简单，因为整个mvn调用信息和失败的测试用例一起被记录了下来，这样你就可以简单的复制粘贴那一行，并重新执行该测试就好了。
   
   [[generating-random-data]]
  -==== Generating random data
  -
  -The next step is to convert your test using static test data into a test using randomized test data. The kind of data you could randomize varies a lot with the functionality you are testing against. Take a look at the following examples (note, that this list could go on for pages, as a distributed system has many, many moving parts):
  -
  -* Searching for data using arbitrary UTF8 signs
  -* Changing your mapping configuration, index and field names with each run
  -* Changing your response sizes/configurable limits with each run
  -* Changing the number of shards/replicas when creating an index
  -
  -So, how can you create random data. The most important thing to know is, that you never should instantiate your own `Random` instance, but use the one provided in the `RandomizedTest`, from which all elasticsearch dependent test classes inherit from.
  -
  -[horizontal]
  -`getRandom()`::         Returns the random instance, which can recreated when calling the test with specific parameters
  -`randomBoolean()`::     Returns a random boolean
  -`randomByte()`::        Returns a random byte
  -`randomShort()`::       Returns a random short
  -`randomInt()`::         Returns a random integer
  -`randomLong()`::        Returns a random long
  -`randomFloat()`::       Returns a random float
  -`randomDouble()`::      Returns a random double
  -
  -`randomInt(max)`::      Returns a random integer between 0 and max
  -`between()`::           Returns a random between the supplied range
  -`atLeast()`::           Returns a random integer of at least the specified integer
  -`atMost()`::            Returns a random integer of at most the specified integer
  -
  -`randomLocale()`::      Returns a random locale
  -`randomTimeZone()`::    Returns a random timezone
  -
  -`randomFrom()`::        Returns a random element from a list/array
  -
  -In addition, there are a couple of helper methods, allowing you to create random ASCII and Unicode strings, see methods beginning with `randomAscii`, `randomUnicode`, and `randomRealisticUnicode` in the random test class. The latter one tries to create more realistic unicode string by not being arbitrary random.
  -
  -If you want to debug a specific problem with a specific random seed, you can use the `@Seed` annotation to configure a specific seed for a test. If you want to run a test more than once, instead of starting the whole test suite over and over again, you can use the `@Repeat` annotation with an arbitrary value. Each iteration than gets run with a different seed.
  -
  +==== 随机数据生成
  +
  +接下来就是将你的测试用例从使用静态测试数据转变为使用随机测试数据。 你需要随机化的数据随着你的测试功能的不同可能有比较大的差异。看下面的例子（注意，下面的列表中得内容可能会改变，因为分布式系统经常会有很多很多的变化）：
  +
  +* 搜索那些包含任意UTF8字符的数据
  +* 在每个用例中改变映射配置，索引和字段名称
  +* 在每个用例中改变你的请求返回的数据量或者改变配置的最大限制记录数
  +* 在创建索引时改变主分片或从分片的大小
  +
  +那么，如何生成随机数据呢。你需要知道的最重要的一点是， 你不应该自己实例化 `Random` 实例，而应该使用 `RandomizedTest` 所提供的实例， 所有elasticsearch测试类都是从这个类继承而来的。
  +[horizontal]
  +`getRandom()`::         返回一个random的实例，这个实例也可以通过传入特别的参数来重新创建一个新的。
  +`randomBoolean()`::     返回一个随机 boolean 对象
  +`randomByte()`::        返回一个随机 byte 对象
  +`randomShort()`::       返回一个随机 short 对象
  +`randomInt()`::         返回一个随机 integer 对象
  +`randomLong()`::        返回一个随机 long 对象
  +`randomFloat()`::       返回一个随机 float 对象
  +`randomDouble()`::      返回一个随机 double 对象
  +
  +`randomInt(max)`::      返回一个0到 max 之间的随机 integer 对象
  +`between()`::           返回一个指定范围内的随机值
  +`atLeast()`::           返回一个不小于某个数的随机 integer 对象
  +`atMost()`::            返回一个不超过某个数的随机 integer 对象
  +
  +`randomLocale()`::      返回一个随机 locale 对象
  +`randomTimeZone()`::    返回一个随机 timezone 对象
  +
  +`randomFrom()`::        从一个 list/array 中随机返回一个元素
  +
  +另外，在这个随机测试类中，还包含一些帮助方法，可以用它们生成随机 ASCII 和 Unicode 字符串， 见方法名以 `randomAscii`, `randomUnicode`, 和 `randomRealisticUnicode` 开头的那些方法。
  +如果你在调试一个特别的问题时，需要用到一个特别的随机种子， 可以使用 `@Seed` 这个注解来达到在测试用例中配置一个特定种子的目的。 如果你希望运行一个测试用例多次，不需要一次又一次的重启该测试套件，你可以直接使用 `@Repeat` 注解就可以了，该注解可以设置重复任意次数， 每次迭代使用一个不同的随机种子。
   
   [[assertions]]
  -=== Assertions
  +=== 断言
   
   As many elasticsearch tests are checking for a similar output, like the amount of hits or the first hit or special highlighting, a couple of predefined assertions have been created. Those have been put into the `ElasticsearchAssertions` class. There is also a specific geo assertions in `ElasticsearchGeoAssertions`.
  -
  -[horizontal]
  -`assertHitCount()`::        Checks hit count of a search or count request
  -`assertAcked()`::           Ensure the a request has been acknowledged by the master
  -`assertSearchHits()`::      Asserts a search response contains specific ids
  -`assertMatchCount()`::      Asserts a matching count from a percolation response
  -`assertFirstHit()`::        Asserts the first hit hits the specified matcher
  -`assertSecondHit()`::       Asserts the second hit hits the specified matcher
  -`assertThirdHit()`::        Asserts the third hits hits the specified matcher
  -`assertSearchHit()`::       Assert a certain element in a search response hits the specified matcher
  -`assertNoFailures()`::      Asserts that no shard failures have occurred in the response
  -`assertFailures()`::        Asserts that shard failures have happened during a search request
  -`assertHighlight()`::       Assert specific highlights matched
  -`assertSuggestion()`::      Assert for specific suggestions
  -`assertSuggestionSize()`::  Assert for specific suggestion count
  -`assertThrows()`::          Assert a specific exception has been thrown
  -
  -Common matchers
  -
  -[horizontal]
  -`hasId()`::     Matcher to check for a search hit id
  -`hasType()`::   Matcher to check for a search hit type
  -`hasIndex()`::  Matcher to check for a search hit index
  -`hasScore()`::  Matcher to check for a certain score of a hit
  -`hasStatus()`:: Matcher to check for a certain `RestStatus` of a response
  -
  -Usually, you would combine assertions and matchers in your test like this
  -
  +由于在 elasticsearch 中经常需要检查一些相似的输出，比如匹配到的文档数量，第一个匹配文档，或者是特殊高亮片段，因此预置了一些断言。 这些断言被放在 `ElasticsearchAssertions` 类中。 同时， 特别针对 geo 相关处理的断言也可以在 `ElasticsearchGeoAssertions` 中找到。
  +[horizontal]
  +`assertHitCount()`::        检查搜索或者 count 请求匹配到的文档数量
  +`assertAcked()`::           确保一个请求被主节点接受了
  +`assertSearchHits()`::      断言一个请求返回中包含特定的id列表
  +`assertMatchCount()`::      对于percolation请求，断言匹配数
  +`assertFirstHit()`::        断言第一个文档，命中了特定的匹配规则
  +`assertSecondHit()`::       断言第二个文档，命中了特定的匹配规则
  +`assertThirdHit()`::        断言第三个文档，命中了特定的匹配规则
  +`assertSearchHit()`::       断言返回中指定文档，命中了特定的匹配规则
  +`assertNoFailures()`::      断言在返回中不包含分片失败的信息
  +`assertFailures()`::        断言在返回中包含有分片失败的信息
  +`assertHighlight()`::       断言有指定的高亮片段被匹配到
  +`assertSuggestion()`::      断言包含指定的搜索建议
  +`assertSuggestionSize()`::  断言包含指定的搜索建议数
  +`assertThrows()`::          断言某个特定的异常被抛出
  +
  +通用匹配器
  +
  +[horizontal]
  +`hasId()`::     检查匹配到的文档id的匹配器
  +`hasType()`::   检查匹配到的文档类型的匹配器
  +`hasIndex()`::  检查匹配到的文档所属索引的匹配器
  +`hasScore()`::  检查匹配到的文档得分的匹配器
  +`hasStatus()`:: 检查返回中是否包含特定 `RestStatus` 的匹配器
  +
  +通常， 你需要像下面这样组合使用断言和匹配器
   [source,java]
   ----------------------------
   SearchResponse seearchResponse = client().prepareSearch() ...;
  
positive.code: assertFirstHit(searchResponse, hasId("4"));
  assertSearchHits(searchResponse, "1", "2", "3", "4");
  ----------------------------
  
  
  
negative.code: 
  
  [[accessing-clients]]
  ==== 操作客户端
  
  为了执行某些操作，你需要使用一个客户端。你可以通过 `ESIntegTestCase.client()` 来随机返回一个客户端。 这个客户端是 `ThansportClient` 或 `NodeClient` 中的一个，通常在执行操作的时候，你不会在意具体是哪种类型的客户端。关于客户端的选择， `InternalTestCluster` 这个类里有更多的选择， 你可以通过 `ESIntegTestCase.InternalTestCluster` 这个方法来获得该类。
  [horizontal]
  `iterator()`::                  返回所有可用的客户端的迭代器
  `masterClient()`::              返回一个连接到主节点的客户端
  `nonMasterClient()`::           返回一个连接到非主节点的客户端
  `clientNodeClient()`::          返回一个连接到客户端节点的客户端
  `client(String nodeName)`::     返回一个连接到指定节点的客户端
  `smartClient()`::               返回一个智能客户端
  
  
  [[scoping]]
  ==== 范围
  
  默认情况下，一个集群只会分配给一个测试套件中的单元测试来运行， 并且所有的索引和模板都会在每个单元测试完成后被删除。但是，假如你再测试时希望加载某个插件，你希望每个单元测试启动一个新集群，但不希望每次都加载这个插件。
  这个时候，你就可以在类级别上使用 `@ClusterScope` 注解来配置这种行为。
  
  [source,java]
  -----------------------------------------
  