incubator-cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rohit Yadav <>
Subject Re: [Discuss] Integration test
Date Mon, 07 Jan 2013 23:29:57 GMT
Thanks Edison for the proposal, this is something we really need. Now that CloudStack is a
lot feature rich we want to make it easier for developers to build components and contribute
stuff at the same time make sure different parts tie up without losing integrity.

On 07-Jan-2013, at 2:11 PM, Edison Su <> wrote:

> Hi All,
>     As Cloudstack is becoming more modularized, we can start thinking about how to test
these components.
>     The organization of maven projects in cloudstack. At lowest level, it's a maven project.
The modularized component, means a group of maven projects. The subsystem, means a logical
group of  components. A system, will be build on a lot of subsystems. For example, there will
be a system called, cloud-engine, which is a server, provides restful API service to other
systems(e.g API server). Cloud-engine will have a set of subsystems: computing, storage, network
etc. For each subsystem, will have a group of components: e.g. storage subsystem will include
volume/image/snapshot .. components. For each component, will have a set of maven projects,
 for example, volume component will have a maven project, called storage-volume, and a lot
of plugin projects, such as (storage-volume-plugin-solidfire, storage-volume-plugin-netapp
>     Based on above hierarchy, the integration test will happen at different levels: at
component level, at subsystem level, at system level etc. I want to bring up the discuss about
how to organize integration tests, and which integration test framework should we use. 
>    First, how to organize integration tests? The organization will be affected/constrained
by the dependency between maven projects you want to test.
>          1. Will the integration test at each level have its own maven project?  Or we
put all the integration test cases into one giant maven project? I'd prefer one maven project
at one level, as it looks like more cleaner. For example, there will be a storage-integration-test
maven project, which depends on storage-volume-integration-test, storage-image-integration-test,
and so on, while storage-volume-integration-test will depend on storage-volume, storage-volume-plugin-solidfire,
and storage-volume-plugin-netapp and so on. When you write test case at each level, you only
focus on the limited area you want to test: the design of test case and the configuration
file of each test case, will/can only be specific to the area. Hope it will make writing test
case easier.

I think we should have integration tests place locally to a maven project, but these tests
extend or implement integration tests for that module. For example, we'll have three top level
modules, compute, storage and network. So, for storage for example a storage plugin developer
should have the plugin as maven project on one level and the integration test along with it.
If applicable these tests should extend/implement a common test class/framework/mechanism.
It would be better to keep code and test together and would make it easier for a developer
to work on things, putting everything in one giant maven project will make it difficult for
a new developer to contribute their work.

>          2. Which test framework we should use? Junit or testNG? I was sold to testNG
by its feature sets: parametrized test case, group test cases, running test case in parallel
at different level(method, class etc), test case dependency etc. You can find out more information
about testNG at

While we can have both, I too like testNG (similar to our pythonic integration smoke tests
in a lot of ways :), the listener way in testNG can be useful to write your own processing
and tricks. JUnit can test very well a particular class, but it's not very good at testing
contracts and integrity with other piece of code.
Which one should we use: testNG!


> 	But in order to integrate testNG with Spring, need a little bit coding. For example,
may need to add a listener in testNG, to inject @DB annotation, and need to make sure mockito
will work. I created a base testNG class: CloudStackTestNGBase, which can read configuration
parameters from a testNG config xml file, setup @DB context for each test case etc. 
>   Comments/feedback are welcome!

View raw message