HBASE-15919 Modify docs to change from @Rule to @ClassRule. Also clarify that timeout limits are on test case level. (Apekshit)
Change-Id: Ifcd0264ea147bcb1100db74d92da95b643f4793f Signed-off-by: stack <stack@apache.org>
This commit is contained in:
parent
75c2360543
commit
5ea2f09233
|
@ -864,7 +864,8 @@ Also, keep in mind that if you are running tests in the `hbase-server` module yo
|
||||||
[[hbase.unittests]]
|
[[hbase.unittests]]
|
||||||
=== Unit Tests
|
=== Unit Tests
|
||||||
|
|
||||||
Apache HBase unit tests are subdivided into four categories: small, medium, large, and integration with corresponding JUnit link:http://www.junit.org/node/581[categories]: `SmallTests`, `MediumTests`, `LargeTests`, `IntegrationTests`.
|
Apache HBase test cases are subdivided into four categories: small, medium, large, and
|
||||||
|
integration with corresponding JUnit link:http://www.junit.org/node/581[categories]: `SmallTests`, `MediumTests`, `LargeTests`, `IntegrationTests`.
|
||||||
JUnit categories are denoted using java annotations and look like this in your unit test code.
|
JUnit categories are denoted using java annotations and look like this in your unit test code.
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
|
@ -879,10 +880,11 @@ public class TestHRegionInfo {
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
The above example shows how to mark a unit test as belonging to the `small` category.
|
The above example shows how to mark a test case as belonging to the `small` category.
|
||||||
All unit tests in HBase have a categorization.
|
All test cases in HBase should have a categorization.
|
||||||
|
|
||||||
The first three categories, `small`, `medium`, and `large`, are for tests run when you type `$ mvn test`.
|
The first three categories, `small`, `medium`, and `large`, are for test cases which run when you
|
||||||
|
type `$ mvn test`.
|
||||||
In other words, these three categorizations are for HBase unit tests.
|
In other words, these three categorizations are for HBase unit tests.
|
||||||
The `integration` category is not for unit tests, but for integration tests.
|
The `integration` category is not for unit tests, but for integration tests.
|
||||||
These are run when you invoke `$ mvn verify`.
|
These are run when you invoke `$ mvn verify`.
|
||||||
|
@ -890,22 +892,23 @@ Integration tests are described in <<integration.tests,integration.tests>>.
|
||||||
|
|
||||||
HBase uses a patched maven surefire plugin and maven profiles to implement its unit test characterizations.
|
HBase uses a patched maven surefire plugin and maven profiles to implement its unit test characterizations.
|
||||||
|
|
||||||
Keep reading to figure which annotation of the set small, medium, and large to put on your new HBase unit test.
|
Keep reading to figure which annotation of the set small, medium, and large to put on your new
|
||||||
|
HBase test case.
|
||||||
|
|
||||||
.Categorizing Tests
|
.Categorizing Tests
|
||||||
Small Tests (((SmallTests)))::
|
Small Tests (((SmallTests)))::
|
||||||
_Small_ tests are executed in a shared JVM.
|
_Small_ test cases are executed in a shared JVM and individual test cases should run in 15 seconds
|
||||||
We put in this category all the tests that can be executed quickly in a shared JVM.
|
or less; i.e. a link:https://en.wikipedia.org/wiki/JUnit[junit test fixture], a java object made
|
||||||
The maximum execution time for a small test is 15 seconds, and small tests should not use a (mini)cluster.
|
up of test methods, should finish in under 15 seconds. These test cases can not use mini cluster.
|
||||||
|
These are run as part of patch pre-commit.
|
||||||
|
|
||||||
Medium Tests (((MediumTests)))::
|
Medium Tests (((MediumTests)))::
|
||||||
_Medium_ tests represent tests that must be executed before proposing a patch.
|
_Medium_ test cases are executed in separate JVM and individual test case should run in 50 seconds
|
||||||
They are designed to run in less than 30 minutes altogether, and are quite stable in their results.
|
or less. Together, they should take less than 30 minutes, and are quite stable in their results.
|
||||||
They are designed to last less than 50 seconds individually.
|
These test cases can use a mini cluster. These are run as part of patch pre-commit.
|
||||||
They can use a cluster, and each of them is executed in a separate JVM.
|
|
||||||
|
|
||||||
Large Tests (((LargeTests)))::
|
Large Tests (((LargeTests)))::
|
||||||
_Large_ tests are everything else.
|
_Large_ test cases are everything else.
|
||||||
They are typically large-scale tests, regression tests for specific bugs, timeout tests, performance tests.
|
They are typically large-scale tests, regression tests for specific bugs, timeout tests, performance tests.
|
||||||
They are executed before a commit on the pre-integration machines.
|
They are executed before a commit on the pre-integration machines.
|
||||||
They can be run on the developer machine as well.
|
They can be run on the developer machine as well.
|
||||||
|
@ -1049,9 +1052,7 @@ ConnectionCount=1 (was 1)
|
||||||
|
|
||||||
* All tests must be categorized, if not they could be skipped.
|
* All tests must be categorized, if not they could be skipped.
|
||||||
* All tests should be written to be as fast as possible.
|
* All tests should be written to be as fast as possible.
|
||||||
* Small category tests should last less than 15 seconds, and must not have any side effect.
|
* See <<hbase.unittests,hbase.unittests> for test case categories and corresponding timeouts.
|
||||||
* Medium category tests should last less than 50 seconds.
|
|
||||||
* Large category tests should last less than 3 minutes.
|
|
||||||
This should ensure a good parallelization for people using it, and ease the analysis when the test fails.
|
This should ensure a good parallelization for people using it, and ease the analysis when the test fails.
|
||||||
|
|
||||||
[[hbase.tests.sleeps]]
|
[[hbase.tests.sleeps]]
|
||||||
|
@ -1080,56 +1081,28 @@ This will allow to share the cluster later.
|
||||||
[[hbase.tests.example.code]]
|
[[hbase.tests.example.code]]
|
||||||
==== Tests Skeleton Code
|
==== Tests Skeleton Code
|
||||||
|
|
||||||
Here is a test skeleton code with Categorization and a Category-based timeout Rule to copy and paste and use as basis for test contribution.
|
Here is a test skeleton code with Categorization and a Category-based timeout rule to copy and paste and use as basis for test contribution.
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
/**
|
/**
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
* Describe what this testcase tests. Talk about resources initialized in @BeforeClass (before
|
||||||
* or more contributor license agreements. See the NOTICE file
|
* any test is run) and before each test is run, etc.
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. The ASF licenses this file
|
|
||||||
* to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.hbase;
|
// Specify the category as explained in <<hbase.unittests,hbase.unittests>>.
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import org.apache.hadoop.hbase.testclassification.SmallTests;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Rule;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.experimental.categories.Category;
|
|
||||||
import org.junit.rules.TestName;
|
|
||||||
import org.junit.rules.TestRule;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Skeleton HBase test
|
|
||||||
*/
|
|
||||||
// NOTICE: See how we've 'categorized' this test. All hbase unit tests need to be categorized as
|
|
||||||
// either 'small', 'medium', or 'large'. See http://hbase.apache.org/book.html#hbase.tests
|
|
||||||
// for more on these categories.
|
|
||||||
@Category(SmallTests.class)
|
@Category(SmallTests.class)
|
||||||
public class TestExample {
|
public class TestExample {
|
||||||
// Handy test rule that allows you subsequently get at the name of the current method. See
|
// Replace the TestExample.class in the below with the name of your test fixture class.
|
||||||
// down in 'test()' where we use it in the 'fail' message.
|
private static final Log LOG = LogFactory.getLog(TestExample.class);
|
||||||
|
|
||||||
|
// Handy test rule that allows you subsequently get the name of the current method. See
|
||||||
|
// down in 'testExampleFoo()' where we use it to log current test's name.
|
||||||
@Rule public TestName testName = new TestName();
|
@Rule public TestName testName = new TestName();
|
||||||
|
|
||||||
// Rather than put a @Test (timeout=.... on each test so for sure the test times out, instead
|
// CategoryBasedTimeout.forClass(<testcase>) decides the timeout based on the category
|
||||||
// just the CategoryBasedTimeout... It will apply to each test in this test set, the timeout
|
// (small/medium/large) of the testcase. @ClassRule requires that the full testcase runs within
|
||||||
// that goes w/ the particular test categorization.
|
// this timeout irrespective of individual test methods' times.
|
||||||
@Rule public final TestRule timeout = CategoryBasedTimeout.builder().withTimeout(this.getClass()).
|
@ClassRule
|
||||||
withLookingForStuckThread(true).build();
|
public static TestRule timeout = CategoryBasedTimeout.forClass(TestExample.class);
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
|
@ -1140,8 +1113,8 @@ public class TestExample {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void testExampleFoo() {
|
||||||
fail(testName.getMethodName() + " is not yet implemented");
|
LOG.info("Running test " + testName.getMethodName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
Loading…
Reference in New Issue