Gang,
First of all, Happy New Year to all @ops4j!
The new Pax Exam (former pax drone) is going more and more concrete.
Now, we would like to get your opinion in some of the designs.

Imagine a test like you know (using Junit4):

@RunWith( JUnit4TestRunner.class )
public class SimpleTest
{
    @Test
    public void defaultBundles( final BundleContext bundleContext )
    {
        assertEquals( 9, bundleContext.getBundles().length );
    }
}

Note, the initial RunWith tells the runner to use Pax Exam instead of the
standard junit4 runner.
Basically you are done now. Now begin writing tests with standard Junit4
@Test annotation.

Now, you want to configure you osgi testcontainer in a certain way (select
framework, add bundles and 100 things more)
You can do that by adding a method to you class that has the @Configuration
annotation:

@RunWith( JUnit4TestRunner.class )
public class SimpleTest
{

    @Configuration
    public static Option[] configureToUse()
    {
        return options(
          logProfile(),
          equinox()
        );
    }

    @Test
    public void defaultBundles( final BundleContext bundleContext )
    {
        assertEquals( 9, bundleContext.getBundles().length );
    }
}

Now, you have equinox and the log profile (from paxrunner) enabled.

New in Pax Exam is the ability to have multiple configurations.
So you can run for example the same test with two different framework
versions.
Now, you have to wire configurations to testcases.
We currently have two approaches to that:
@RunWith( JUnit4TestRunner.class )
public class SimpleTest
{

     @Configuration
    public static Option[] configure()
    {
        return options(
            logProfile()
        );
    }

    @Configuration
    @AppliesTo( "junitBundlesSpecified.*" )
    public static Option[] configureAnotherVersionOfJUnit()
    {
        return options(
            junitBundles().version( "4.5.0" )
        );
    }

    /**
     * Tests that the provisioned JUnit bundles are the default ones
(4.4.0).
     */
    @Test
    public void junitBundlesNotSpecified()
    {

    }

    /**
     * Tests that the provisioned JUnit bundles are the specified ones
(4.5.0).
     */
    @Test
    public void junitBundlesSpecified()
    {

    }
}

See that there is the @AppliesTo annotation involved. This is a regular
expression for test method names.
So we assign one configuration just to test methods starting with
junitBundlesSpecified.
The other configuration is added to all tests (default value of appliesTo is
".*")

We think of another approach to assign them, without relying to method
names:
@RunWith( JUnit4TestRunner.class )
public class SimpleTest
{

     @Configuration
     @Context( "standard" )
    public static Option[] configure()
    {
        return options(
            logProfile()
        );
    }

    @Configuration
    @Context( "junitBundlesSpecified" )
    public static Option[] configureAnotherVersionOfJUnit()
    {
        return options(
            junitBundles().version( "4.5.0" )
        );
    }

    /**
     * Tests that the provisioned JUnit bundles are the default ones
(4.4.0).
     */
    @Test
    @Context( "standard" )
    public void junitBundlesNotSpecified()
    {

    }

    /**
     * Tests that the provisioned JUnit bundles are the specified ones
(4.5.0).
     */
    @Test
    @Context( "standard","junitBundlesSpecified" )
    public void junitBundlesSpecified()
    {

    }
}

Here we use context annotation to wire them. Default context is "" so you
still can go completely without context.
This is much more typing, but does not glue together method names and
annotation values but completely relies on annotation data.

What do you think ?
You can find all this here
https://scm.ops4j.org/repos/ops4j/projects/pax/exam
And see some examples here:
https://scm.ops4j.org/repos/ops4j/projects/pax/exam/pax-exam-it-01

Feel free to ask try it out and discuss.
Any comments+contributions are welcome!
cheers,
Toni

-- 
Toni Menzel
Software Developer
[email protected]
http://www.ops4j.org     - New Energy for OSS Communities - Open
Participation Software.
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general

Reply via email to