anchor.diff:  [[testing-framework]]
  -== Java Testing Framework
  +== Java 测试框架
   
   [[testing-intro]]
   
  -Testing is a crucial part of your application, and as information retrieval itself is already a complex topic, there should not be any additional complexity in setting up a testing infrastructure, which uses elasticsearch. This is the main reason why we decided to release an additional file to the release, which allows you to use the same testing infrastructure we do in the elasticsearch core. The testing framework allows you to setup clusters with multiple nodes in order to check if your code covers everything needed to run in a cluster. The framework prevents you from writing complex code yourself to start, stop or manage several test nodes in a cluster. In addition there is another very important feature called randomized testing, which you are getting for free as it is part of the elasticsearch infrastructure.
  -
  +测试是应用程序中关键的一环， 特别是对elasticsearch属于信息检索这样的一个本身就很复杂的领域，
  +就更不应该在搭建测试基础设施上增加复杂性了。这就是我们在发布版本中添加一个额外的文件，让你可以使用和elasticsearch核心模块同意的测试框架的一个主要原因。 这个测试框架让你可以搭建一个多节点的集群，从而可以检查代码是否覆盖了集群环境运行情况下得各种情况。这个框架不需要你写很复杂的代码来启动，停止或者管理集群中的一些测试节点。更进一步，发布版本中还包含一个重要功能，叫做随机测试，因为这是elasticsearch基础设施的一部分，因此你可以免费使用。
   
   
   [[why-randomized-testing]]
  -=== why randomized testing?
  -
  -The key concept of randomized testing is not to use the same input values for every testcase, but still be able to reproduce it in case of a failure. This allows to test with vastly different input variables in order to make sure, that your implementation is actually independent from your provided test data.
  -
  -All of the tests are run using a custom junit runner, the `RandomizedRunner` provided by the randomized-testing project. If you are interested in the implementation being used, check out the http://labs.carrotsearch.com/randomizedtesting.html[RandomizedTesting webpage].
  -
  +=== 为什么需要随机测试？
  +
  +随机测试的核心概念是不在每个测试用例中使用相同的输入值，但在错误发生时依然可以重现问题。这样举可以使用各种不同的输入变量来进行测试，从而确保你的实现与你提供的测试数据是独立的。
  +所有测试都使用一个自定义junit runner， 叫做 `RandomizedRunner`， 该runner由随机测试项目提供。 如果你对实现细节感兴趣， 请参考 http://labs.carrotsearch.com/randomizedtesting.html[随机测试网页].
   
   [[using-elasticsearch-test-classes]]
  -=== Using the elasticsearch test classes
  -
  -First, you need to include the testing dependency in your project, along with the elasticsearch dependency you have already added. If you use maven and its `pom.xml` file, it looks like this
  -
  +=== 使用 elasticsearch 测试类
  +
  +首先，你需要在添加elasticsearch依赖包的同时添加测试框架的依赖包到项目中。 如果你使用maven来管理项目，那么 pom.xml 文件看上去就像下面这样
   [[source,xml]]
  +
   --------------------------------------------------
   <dependencies>
     <dependency>
  
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]
  -----------------------------------------
  