TestNG, Junit and log4j - junit

Is there any easy way to configure log4j so that in unit tests I only print the stacktrace of the failing tests without having noise in the output on the shell?
Right now when I execute tests I can see the output printed by the classes I am testing. I want to avoid that since it's not bringing any value for passing tests

I would recommend to have log4j.properties file under src/test/resources with content:
log4j.rootLogger=OFF
As result all your production classes will not log but the jUnit or testNG will print the failed tests as you expect.

In your unit test, set the log level to the level at which stacktraces are being logged:
Logger.getRootLogger().setLevel(Level.WARNING);

Related

Why Cucumber JVM does not fail step or step definition when an exception is thrown?

I am writing cucumber jvm test code using junit as runner. Some how i notice that even though the test code is throwing a lot of runtime exceptions. The step/step definitions still show as 'PASSED' in report.
If i remembered correctly, i've use cucumber jvm before and it always fail the steps whenever there is an exception. But now, i can only fail the step when assertion fail.
What am i missing here? Could anyone give an advice/hint?
Are you using try catch statements? if so then you see the catch block logs.
If you want to let the scenario fail then use how possible more asserts and Boolean functions.
Can't help you out with the info you shared.

JSR:352 Unit testing Java Batch Code?

Can we use JUnit to test java batch jobs? Since Junit runs locally and java batch jobs run on the server, i am not sure how to start a job (i tried using using the JobOperator class) from JUnit test cases.
If JUnit is not the right tool, how can we unit test java batch code.
I am using using IBM's implementation of JSR 352 running on WAS Liberty
JUnit is first of all an automation and test monitor framework. Meaning: you can use it to drive all kinds of #Test methods.
From an conceptual point, the definition of unit tests is pretty vague; if you follow wikipedia, "everything you do to test something" can be seen as unit test. Following that perspective, of course, you can "unit test" batch code that runs on a batch framework.
But: most people think that "true", "helpful" unit tests do not require the presence of any external thing. Such tests can be run "locally" at build time. No need for servers, file systems, networking, ...
Keeping that in mind, I think there are two things you can work with:
You can use JUnit to drive "integration" or "functional tests". Meaning: you can define test suites that do the "full thing" - define batches, have them processed to check for expected results in the end. As said, that would be integration tests that make sure the end-to-end flow works as expected.
You look into"normal" JUnit unit-testing. Meaning: you focus on those aspects in your code that are "un-related" to the batch framework (in other words: look out for POJOs) and unit-test those. Locally; maybe with mocking frameworks; without relying on a real batch service running your code.
Building on the answer from #GhostCat, it seems you're asking how to drive the full job (his bullet 1.) in your tests. (Of course unit testing the reader/processor/writer components individually can also be useful.)
Your basic options are:
Use Arquillian (see here for a link on getting started with Arquillian and Liberty) to run your tests in the server but to let Arquillian handle the tasks of deploying the app to the server and collecting the results.
Write your own servlet harness driving your job through the JobOperator interface. See the answer by #aguibert to this question for a starting point. Note you'll probably want to write your own simple routine polling the JobExecution for one of the "finished" states (COMPLETED, FAILED, or STOPPED) unless your jobs have some other means of making the submitter aware.
Another technique to keep in mind is the startup bean. You can run your jobs simply by starting the server with a startup bean like:
#Startup
#Singleton
public class StartupBean {
JobOperator jobOp = BatchRuntime.getJobOperator();
// Drive job(s) on startup.
jobOp.start(...);
This can be useful if you have a way to check the job results separate from using the JobOperator interface (for which you need to be in the server). Your tests can simply poll and check for the job results. You don't even have to open an HTTP port, and the server startup overhead is only a few seconds.

Log4j - log JUnit current test method name

I have a bunch of tests (JUnit) and a lot of logging performed using log4j in various code called from those tests.
I now need to separate logs in files between tests similarly to how JUnit separates stdout and stderr. The easiest way I see is to somehow log test class&name (for example, using MDC) along with the logging messages.
I can't just direct all logging to console and rely on JUnit to assign stdout to proper test since piece of logging that I want to analyze should not be visible in standard output.
The only solution I see is to have some special #Rule that will put test class&method name into MDC, however I'd rather not change the tests themselves since it would complicate further support.

"smart" JUnit test ordering

I want to add some hints to my build, to run certain tests "first" without re-running them later.
Simply add Class names to a "priority" string in an input parameter to my test task, or
Have JUnit's testers smart enough to remember/persist failing test class names, so that the next time around the builder runs those first.
What is the most idiomatic way of doing this in Ant?
The following tools might help you to achieve the desired JUnit test execution order, but they depend on Eclipse usage:
Continuous Testing for Eclipse (CT-Eclipse)
JUnit Max
infinitest
I have not used any of those tools, and I have no Ant-only solution.
You might consider these related posts:
Run JUnit automatically when building Eclipse project
Starting unit tests automatically after saving a file

fail hudson build on single unit test failure

Is there a way to cause hudson to report a build as failed, rather than unstable, if only a single unit test fails? thanks.
Hudson actually enables the ignoring of test failures. It just needs to be put as a property in hudson.
-Dmaven.test.failure.ignore=false
It's actually not a good idea to fail the build if tests failed when using hudson. Problem is hudson will not report the state of test pass/fail if the build fails. If the build fails, hudson deems it to not have completed properly and thus does not act on the result.
There are two properties to the junit task
errorProperty="maven.test.error"
failureProperty="maven.test.failure"
After the junit tag you should be able to do something like this
<fail message="Test failed!!!" if="maven.test.error" />
<fail message="Test failed!!!" if="maven.test.failure" />
But don't nail me on this
If you're using Ant to drive the build, you can configure the JUnit task to halt on failure. Is that what you mean?
Look through your job configuration, I believe there is a property (check box) that says fail on test failure, or something of the sort. We use this on some of our projects at my work.
Otherwise if you want to use the Ant method as suggested maven can run ant tasks...