Thursday, September 29, 2011
No new JUnit release announcements, period, here.
Thursday, September 22, 2011
No new beta-release announcements here
Tuesday, August 23, 2011
JUnit 4.9 released
This release's theme is Test-class and suite level Rules. The release notes are copied in part below, and can be read in full here.
Go ahead and download, or merely let maven do the work for you (as we are now directly releasing to sonatype's maven repository on the same day we release the jars).
Following this release, work on JUnit and related code will continue on three fronts:
- Bug fixes against existing functionality will be committed to the 4.9.1 branch.
- New core features will be committed on the 4.10 branch.
- We have created a new junit.contrib project to be a home to new experimental features, features that use additional dependencies, and features that are outside of JUnit's core mission. As a first example, Thomas Mueller has created assertthrows, a package that uses all kinds of JDK trickery to allow direct assertions like this:
List<String> emptyList = new ArrayList<String>(); assertThrows(emptyList).get(0);
JUnit 4.9 release notes (highlights)
ClassRule
The ClassRule
annotation extends the idea of method-level Rules,
adding static fields that can affect the operation of a whole class. Any
subclass of ParentRunner
, including the standard BlockJUnit4ClassRunner
and Suite
classes, will support ClassRule
s.
For example, here is a test suite that connects to a server once before all the test classes run, and disconnects after they are finished:
@RunWith(Suite.class)
@SuiteClasses({A.class, B.class, C.class})
public class UsesExternalResource {
public static Server myServer= new Server();
@ClassRule
public static ExternalResource resource= new ExternalResource() {
@Override
protected void before() throws Throwable {
myServer.connect();
};
@Override
protected void after() {
myServer.disconnect();
};
};
}
TestRule
In JUnit 4.9, fields that can be annotated with either @Rule
or @ClassRule
should be of type TestRule
. The old MethodRule
type, which only made sense
for method-level rules, will still work, but is deprecated.
Most built-in Rules have been moved to the new type already, in a way that
should be transparent to most users. TestWatchman
has been deprecated,
and replaced by TestWatcher
, which has the same functionality, but implements
the new type.
Maven support
Maven bundles have, in the past, been uploaded by kind volunteers. Starting with this release, the JUnit team is attempting to perform this task ourselves.
LICENSE checked in
The Common Public License that JUnit is released under is now included in the source repository.
Friday, August 12, 2011
JUnit 4.9b4 (beta-)released
[Edit: fixed release notes link]
Wednesday, July 6, 2011
JUnit 4.9b3 (beta-)released
Tuesday, March 22, 2011
New project: junit.contrib
In this post, I'll first review the reasons for such a project, and
secondly, I have a proposal for its structure, and I'd like feedback.
Background: reasons for junit.contrib
JUnit has always officially strived to be "the intersection of all
useful Java testing frameworks". Thus, the goals for code that gets
into the junit repository include that it should:
- Minimize dependencies on external libraries or particular JDK
versions beyond a widely-used minimum.
- Be very unlikely to change API moving forward.
- Emphasize opportunities for extension over the richness of core features.
- Have potential usefulness to all Java developers, regardless of
their application domain.
- Match in style to the current JUnit codebase.
Proposal
The root structure of the project will contain:/ README docs/ java/ scala/ [?] clojure/ [?]Thus, a folder for overall documentation, and then a folder per-language. I haven't thought about how non-java language extensions should be organized. Under java, there should be a folder per "subproject" (names chosen, with apologies, by my favorite naming tool):
java/ brewmasters/ callisto/ hekler/ norway/ ...Each subproject should be organized as its own maven project:
java/brewmasters/ pom.xml src/main/java/org/junit/contrib/brewmasters/... src/test/java/org/junit/contrib/brewmasters/...
As potential users and contributors to such a repository, are there
pitfalls in this organization that I should be aware of in advance?
Thursday, January 27, 2011
Very very simple testing in bash
Imagine I'm starting today on a software system that I expect to spend
at least a year on. Being me, somewhere in the top five questions I
ask myself is "How am I going to test this?" Frequent automated testing
gives me confidence that I won't find out next week that today I broke
something that was working last week. Writing tests is also an important way
to organize my thinking about what I'm doing. Once I've spent time specifying
where I'm going, it's easier to get there quickly.
Since I'm going to be spending a year on this, it's worth my time to invest time
in tools and frameworks that will make specifying and running these tests easy.
I might even write some of my own.
However, suppose that I'm working on a quick demo that I'm only going to spend
a couple weeks on. Or a data-processing script that I need to have finished
tomorrow. Or a sysadmin task that I expect will only take half an hour?
In these cases, I still want the benefits of testing, but I want to spend
as little time as possible getting started. Also, it's not always clear
what technologies I'll be using: I may start in Java, and then find that
a Python library will give me 80% of what I need.
So, I've started to write start projects with test suites that consist of
nothing more than a bash script with a standard footer I copy-and-paste
from project to project. The advantages:
- Fast startup: I don't need to download anything or
run through any "new project" wizards. - If my project lasts longer than I expected, it's easy to remember how
to run the tests: just run the script. - I can easily refactor to use a more heavyweight framework like JUnit by
calling out to it from the script. - It isn't tied to any underlying implementation choice.
- Perhaps best of all, it rewards a UNIX style of small stdin-to-stdout
plug-and-play components.
With no further ado, here's an example script, this one drawn from
the JUnit build process:
Friday, January 21, 2011
JUnit 4.9b2 (beta-)released
Tuesday, January 4, 2011
Running a JUnit 4 test from a Scala script
As a first attempt, I expected this to work:
However, running this produces a failure in the infrastructure:
What's going on here is that when scala is run in single-file script mode, it implicitly wraps all of the declarations within the declaration of an anonymous singleton object (
Main$$anon
). When JUnit tries to reflectively create an ArithmeticTest object, it runs into the fact that, from the Java perspective, ArithmeticTest is a non-static inner class of Main$$anon
. To get around this requires a bit of a dance, luckily made fairly short due to Scala's compact OO verbiage:If I find myself doing this often, I imagine I'll be pulling this out into an importable library. Share and Enjoy.