menghaoranss opened a new issue #4438: Orchestration unit test development 
guide for new contributors
URL: https://github.com/apache/incubator-shardingsphere/issues/4438
 
 
   ## New contributors guide for unit test task of orchestration
   
   Welcome to Apache ShardingSphere!
   
   Here are some tips for new contributors.
   
   ### Prepare the environment
   
   Apache ShardingSphere is based on the Java platform, so you need related 
environment tools:
   
   -JDK8 version,
   -Java development tool IDE, IDEA or Eclipse is recommended, install lombok 
plugin
   -Git, or git integrated in the IDE
   -Maven3.5
   
   If running Sharding-Proxy locally, you also need:
   
   -MySQL 5.6 or 5.7 server. If you want to verify PostGreSQL or other database 
related functions, you need to install the corresponding database software.
   -Zookeeper 3.5.6 or other version. If you want to verify the configuration 
center of Apollo or Nacos, you need to install the corresponding software.
   
   If you want to debug and run UI related projects, you need to install:
   
   -Node 8.11.1 or higher and corresponding NPM 5.6.0 or higher.
   
   ### Project instruction
   
   #### Download source code
   
   Project address: https://github.com/apache/incubator-shardingsphere
   
   #### Source code description
   
   The source code includes the following sections:
   
   -Main project: SQL Engine, Sharding-jdbc, Sharding-proxy, Orchestration, etc.
   
   -ShardingSphere-UI: frontend (NodeJS / VUE), backend (Java)
   
   -doc project: Documentation, which is also the official website. Need to use 
Go-based Hugo tools to compile to static content.
   -examples project: use examples.
   
   #### Branch description
   
   We advocate modifying and committing on a dedicated branch, and finally 
request a merge to the trunk through a pull request (PR).
   
   Currently, the backbone of apache / incubator-shardingsphere is master and 
the version is 5.0.0-RC [N] -SNAPSHOT.
   
   There is also a 4.0.1 branch that is under maintenance 4.x. The latest 
version currently released is 4.0.0 (note that it is not 4.0.0-RC3). The entire 
official website and documentation are based on this version.
   
   A new branch of doc5.x was newly pulled in order to rewrite 5.x 
documentation and generate a new version of the website.
   
   > Improve the unit test work, you can directly PR to the master.
   
   ##### Clone project
   
   First, you need to add a star to the project by clicking star on the top 
right corner on github.
   
   Then, click fork, which will generate a new copy of your id path.
   
   For example, mine is:
   
   > https://github.com/kimmking/incubator-shardingsphere
   
   ##### Download source
   
   At present, if you git clone the entire project from github, it is about 
240M, (because you want to download all the commit records).
   
   You can use the following methods to reduce the first download data to 20M:
   
   > git clone https://github.com/{your id} / incubator-shardingsphere --depth 1
   
   This will only keep the last 2 commits and the current source code.
   
   At this time, a new folder incubator-shardingsphere will be generated in 
your current directory, which is the entire project source code.
   
   You can see the current branch with the following command:
   
   git branch -vv
   
   The asterisk is the current branch.
   
   ##### Adding remote branches
   
   Then we can use the command
   
   > git remote add apache https://github.com/apache/incubator-shardingsphere
   
   Add the project under apache as one of our remote projects.
   
   Can be used later
   
   git fetch apache master: amaster
   
   Branch apache / master remotely and pull down locally to a new branch called 
amaster.
   
   Can also be used
   
   > git checkout -b bmaster
   
   Pull a new branch called bmaster from the current branch.
   
   Then we can modify and debug on this branch.
   
   After the modification is completed, you can pass
   
   git add.
   
   >git commit -a
   
   To submit changes.
   
   Finally we can pass
   
   git push
   
   Or follow the prompts and use set-upstream to push the new local branch to 
the remote branch with the same name in our own space.
   
   ##### Submit PR
   
   At this point we can submit a PR on github.
   
   Move our branch to the apache / master branch.
   
   #### Compilation Instructions
   
   We generally use
   
   > mvn clean package install
   
   To compile the project.
   
   Can also be used
   
   > mvn clean package install -Prelease
   
   To package the project.
   
   ##### Code style
   
   In order to be compatible with the previous version, the entire project 
compilation level has been Java 1.7, so the classes and features of Java 8 
cannot be used at present, such as LocalDatetime or Stream API.
   
   The entire project needs to execute checkstyle at compile time, and the code 
specifications are stipulated in the checkstyle rules. E.g:
   
   -Cannot introduce unused imports
   -Javadoc must be added to public methods and classes, with the first 
sentence beginning with a capital and ending with an English period
   -Indentation uses 4 spaces, so we can turn on the option to show spaces in 
the IDE
   -Space is required after the comma
   -If statements need to have spaces after
   -Leave a blank line at the end of the file
   -Blank lines are not allowed within methods
   
   Some are subject to the same requirements as unit test code.
   
   ##### Compile time
   
   At present, the entire project compilation takes about 22 minutes.
   
   There are a few tricks to reduce this time.
   
   ##### Dependency Download
   
   Our project uses maven to download dependencies. If your machine is slow to 
access the maven central repository, you can consider using a domestic aliyun 
image. Specific methods can be searched online.
   
   If the dependency is downloaded for the first time on the day, the original 
download can be used in the future. You need to add `-o` to the mvn parameter 
to indicate offline compilation.
   
   For UI projects, you can first install the NodeJS environment locally, and 
then use cnpm instead of the original npm command. Can reduce 2/3 compilation 
time.
   
   ##### Task branch
   
   It is recommended that for each project, a new branch is pulled from apache 
/ master, and the name is the name of the project.
   
   Because the trunk has been changing, other partners are constantly 
maintaining and committing. If your task branch is not submitted on the day of 
the new pull branch, it is recommended to pull the apache / master and 
synchronize it to Branch of your own tasks, early detection of conflicts, and 
ensure that your branch can be merged with the trunk at any time. Refer to the 
following command:
   
   git checkout amaster
   
   >git pull
   >
   >git checkout issue3402
   >
   >git merge amaster
   
   After the task is completed (that is, PR and merged to apache / master), you 
can directly delete the branch:
   
   Git branch -D issue3402
   
   #### Continuous Integration
   
   Currently, two continuous integrations are used in the project, one is 
apache jenkins and the other is travis-ci, which are triggered automatically 
when there is a PR submission in apache / incubator-shardingsphere.
   
   Because of the environment, if one of them reports an error, don't panic, 
and a success is usually enough, otherwise, check the detailed log for 
troubleshooting.
   
   ### Unit test DEMO
   
   #### Example 1
   
   The development tool uses IDEA as an example to write unit tests for the 
following classes:
   
   
`org.apache.shardingsphere.orchestration.center.yaml.swapper.OrchestrationConfigurationYamlSwapper`
   
   + Use the shortcut Ctrl + Shift + T in IDEA to add a unit test class for the 
current class. The default test class name is 
`OrchestrationConfigurationYamlSwapperTest`
   
   + Override methods written in the class, as there are 2 methods in the above 
class
   
   ```java
   /**
        * Swap from InstanceConfiguration to YamlInstanceConfiguration.
        *
        * @param data data to be swapped
        * @return YAML instance configuration
        */
       @Override
       public YamlOrchestrationConfiguration swap(final 
OrchestrationConfiguration data) {
           Map<String, YamlInstanceConfiguration> yamlInstanceConfigurationMap 
= new HashMap();
           Map<String, InstanceConfiguration> instanceConfigurationMap = 
data.getInstanceConfigurationMap();
           for (Entry<String, InstanceConfiguration> each : 
instanceConfigurationMap.entrySet()) {
               InstanceConfigurationYamlSwapper swapper = new 
InstanceConfigurationYamlSwapper();
               yamlInstanceConfigurationMap.put(each.getKey(), 
swapper.swap(each.getValue()));
           }
           YamlOrchestrationConfiguration result = new 
YamlOrchestrationConfiguration();
           result.setInstanceConfigurationMap(yamlInstanceConfigurationMap);
           return result;
       }
       
       /**
        * Swap from YamlInstanceConfiguration to InstanceConfiguration.
        *
        * @param yamlConfiguration YAML instance configuration
        * @return swapped object
        */
       @Override
       public OrchestrationConfiguration swap(final 
YamlOrchestrationConfiguration yamlConfiguration) {
           Map<String, InstanceConfiguration> instanceConfigurationMap = new 
HashMap();
           Map<String, YamlInstanceConfiguration> yamlInstanceConfigurationMap 
= yamlConfiguration.getInstanceConfigurationMap();
           for (Entry<String, YamlInstanceConfiguration> each : 
yamlInstanceConfigurationMap.entrySet()) {
               InstanceConfigurationYamlSwapper swapper = new 
InstanceConfigurationYamlSwapper();
               instanceConfigurationMap.put(each.getKey(), 
swapper.swap(each.getValue()));
           }
           OrchestrationConfiguration result = new 
OrchestrationConfiguration(instanceConfigurationMap);
           return result;
       }
   ```
   
   + The unit test method name starts with assert. Try to describe the content 
of this method as clearly as possible. The test code must follow the code 
specifications and ensure coverage. The above unit test methods are as follows:
   
     ```java
        @Test
         public void assertSwapToYamlOrchestrationConfiguration() {
             OrchestrationConfiguration data = getOrchestrationConfiguration();
             YamlOrchestrationConfiguration result = new 
OrchestrationConfigurationYamlSwapper().swap(data);
             for (String each : result.getInstanceConfigurationMap().keySet()) {
                 assertNotNull(result.getInstanceConfigurationMap().get(each));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getOrchestrationType(),
                         
is(data.getInstanceConfigurationMap().get(each).getOrchestrationType()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getInstanceType(),
                         
is(data.getInstanceConfigurationMap().get(each).getType()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getNamespace(),
                         
is(data.getInstanceConfigurationMap().get(each).getNamespace()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getServerLists(),
                         
is(data.getInstanceConfigurationMap().get(each).getServerLists()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getProps(),
                         
is(data.getInstanceConfigurationMap().get(each).getProperties()));
             }
         }
         
         @Test
         public void assertSwapToOrchestrationConfiguration() {
             YamlOrchestrationConfiguration data = 
getYamlOrchestrationConfiguration();
             OrchestrationConfiguration result = new 
OrchestrationConfigurationYamlSwapper().swap(data);
             for (String each : result.getInstanceConfigurationMap().keySet()) {
                 assertNotNull(result.getInstanceConfigurationMap().get(each));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getOrchestrationType(),
                         
is(data.getInstanceConfigurationMap().get(each).getOrchestrationType()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getType(),
                         
is(data.getInstanceConfigurationMap().get(each).getInstanceType()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getNamespace(),
                         
is(data.getInstanceConfigurationMap().get(each).getNamespace()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getServerLists(),
                         
is(data.getInstanceConfigurationMap().get(each).getServerLists()));
                 
assertThat(result.getInstanceConfigurationMap().get(each).getProperties(),
                         
is(data.getInstanceConfigurationMap().get(each).getProps()));
             }
         }
     ```
   
   + For detailed development specifications, please refer to [ShardingShphere 
Code of 
Conduct](https://shardingsphere.apache.org/community/cn/contribute/code-conduct/)
   
   
   
   ### Other
   
   Everyone is welcome to contribute code and documentation. If you have any 
questions during the period, you can always communicate on the issue board or 
group.
   
   Finally, we wish you all a pleasant trip to ShardingSphere.
   
   
   :)

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to