Categories
discuss

Can I specify a class wide group on a TestNG test case?

I have a base class that represents a database test in TestNG, and I want to specify that all classes extending from this class are of a group “db-test”, however I have found that this doesn’t seem possible. I have tried the @Test annotation:

@Test(groups = { "db-test" })
public class DBTestBase {
}

However, this doesn’t work because the @Test annotation will try to make a bunch of methods into tests, and warnings/errors pop up in eclipse when the tests are run.

So I tried disabling the test, so at least the groups are assigned:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

but then any @BeforeTest (and other similar annotations) ALSO get disabled… which is of course not what I want.

I would like some way to annotate a class as being of a particular type of group, but it doesn’t quite seem possible in TestNG. Does anyone have any other ideas?

Answer

The answer is through a custom org.testng.IMethodSelector:

Its includeMethod() can exclude any method we want, like a public not-annotated method.

However, to register a custom Java MethodSelector, you must add it to the XMLTest instance managed by any TestRunner, which means you need your own custom TestRunner.

But, to build a custom TestRunner, you need to register a TestRunnerFactory, through the -testrunfactory option.

BUT that -testrunfactory is NEVER taken into account by TestNG class… so you need also to define a custom TestNG class :

  • in order to override the configure(Map) method,
  • so you can actually set the TestRunnerFactory
  • TestRunnerFactory which will build you a custom TestRunner,
  • TestRunner which will set to the XMLTest instance a custom XMLMethodSelector
  • XMLMethodSelector which will build a custom IMethodSelector
  • IMethodSelector which will exclude any TestNG methods of your choosing!

Ok… it’s a nightmare. But it is also a code-challenge, so it must be a little challenging 😉

All the code is available at DZone snippets.

As usual for a code challenge:

  • one java class (and quite a few inner classes)
  • copy-paste the class in a ‘source/test’ directory (since the package is ‘test’)
  • run it (no arguments needed)

Update from Mike Stone:

I’m going to accept this because it sounds pretty close to what I ended up doing, but I figured I would add what I did as well.

Basically, I created a Groups annotation that behaves like the groups property of the Test (and other) annotations.

Then, I created a GroupsAnnotationTransformer, which uses IAnnotationTransformer to look at all tests and test classes being defined, then modifies the test to add the groups, which works perfectly with group exclusion and inclusion.

Modify the build to use the new annotation transformer, and it all works perfectly!

Well… the one caveat is that it doesn’t add the groups to non-test methods… because at the time I did this, there was another annotation transformer that lets you transform ANYTHING, but it somehow wasn’t included in the TestNG I was using for some reason… so it is a good idea to make your before/after annotated methods to alwaysRun=true… which is sufficient for me.

The end result is I can do:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

And I made the transformer work with subclassing and everything.

Categories
discuss

What OSS project should I look at if I need to do Spring friendly WorkFlow?

We need to add WorkFlow to our Spring managed application. Does anyone have any useful experience in using any of the myriad of OSS Work Flow solutions? Which one is best? Which one integrates with Spring best? Which ones should we avoid?

Answer

If you only need some simple process orchestration, Spring’s own Web Flow, despite its name can serve as a orchestration task manager. If you need to preserve state for several days then you will need to become an ‘early adopter’ of one of the open-source projects. You may want to look at Eclipse’s BPEL project.

My hunch is that once a clearer picture of the BPEL/BPM/Workflow space emerges you will see Spring provide an abstraction layer the same way they have for JDBC, Transactions, ORM frameworks etc…

Source: stackoverflow
Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Privacy Policy, and Copyright Policy. Content is available under CC BY-SA 3.0 unless otherwise noted. The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 © No Copyrights, All Questions are retrived from public domain..