if ( document.comments_form.url ) { document.comments_form.url.value = getCookie("mtcmthome"); }
Phil Zoio wrote an interesting article describing his experience porting a JUnit extension (DBUnit) over to TestNG.
The bottom line: it's very easy.
The nice thing about JUnit extensions is that they usually interface with JUnit in a very simple manner: by providing their own base class (which you need to extend) and their own setUp()/tearDown() methods (which you need to call in your own setUp()/tearDown()). And this if course very easy to emulate with TestNG.
With that in mind, using existing JUnit extensions with TestNG is straightforward, as Phil convincingly demonstrates.
Phil actually went even further and leveraged the finer TestNG @Configuration methods to provide a DBUnit TestNG extension that's even more flexible than its JUnit counterpart.
There is a class of refactorings that I am using very often in Eclipse and since I recently learned a bit more about it, I thought I would share with the rest of the community.
The refactorings are Extract Method (Alt-Shift-m) and Extract Local Variable (Alt-Shift-l).
Their use is fairly straightforward, but I discovered by accident recently that Eclipse is actually more clever than I thought: when the code segment you are trying to replace with a method is found at several locations within your class, the refactoring is automatically applied to all of them.
Here is an example where the three highlighted lines are also repeated in the method above:
| Before | After |
|
|
| Before | After |
|
|
| Before | After |
|
|
Admittedly, this refactoring is fairly rare but I have used it a few times already for J2ME programming, where every byte counts. If you see a local variable that is only being used once in your code, you should probably consider inlining it.
These refactorings in themselves are pretty benign until you learn their keyboard shortcuts:
Memorize these shortcuts and very soon, you will be using them everywhere.
Okay, I give up. Until today, I didn't think there was any question I couldn't answer with Google (and for the problem at hand, with the Eclipse help or the various forums), but all my attempts have completely failed so far, so I'm hoping asking the question on my blog will work.
In Eclipse, Ctrl-. (control-dot) will take you to the "Next Problem". The problem I have with this behavior is that it also stops at warnings, and most of the time, this is not what I want (I actually filter the Problems view not to display warnings, so it would make sense for Eclipse to recognize I have no desire to navigate to these warnings either).
Does anyone know a way to change the "Next Problem" to jump to problems only? Or better: to jump to whatever next item is listed in my Problems window, which is probably the most flexible way of providing this functionality...
If I get an answer in the comments, my next blog entry will give a few Eclipse tips.
And if I don't get any answer... well, I'll post the tips anyway but I will be very disappointed in you all.
Update: Eugene gave me the answer, shortly followed by Rane Prashant and then Robert. Thanks a lot, guys, you rock! And I learned something in the process! Eugene, my next Eclipse tips are dedicated for you (even though you probably already know them).
In a previous entry, I discussed how using mix-ins lets you compose your code to a finer level and allows you to create smaller bundles of functionalities that you can import and use on demand.
Of course, it is quite possible to take this practice too far and end up with code that is not only broken down too much but also spends most of its time exchanging messages between its various components using more complex communication ways than it should. Sometimes, it just makes sense to group certain methods and fields in the same class.
Formalizing the communication between units of code is a subject that has received very little exposure until recently, and when you are trying to pass information between different classes (A to B) or different packages, you typically use one of the following techniques:
The hard coupling of A and B is a topic that has already been covered many times and can be improved by either using interfaces or dependency injection. However, there is a third way to accomplish this that I am hoping will be used more and more: use a plug-in architecture.
I have written quite a few Eclipse plug-ins these past years (and more recently, RCP applications) and I started noticing two very interesting trends in the code that this environment made me produce:
In case you were wondering about the reasons behind the explosion of Eclipse plug-ins, look no further: the reasons are outlined above, and the bottom line is that the learning curve to add to existing code with the Eclipse model is extremely small (and can actually go down over time). When new developers join your project, they don't need to learn a new architecture because that architecture has been formalized by Eclipse and everybody now agrees on how the plug-ins are declared and how they interact with each other. The rest is, literally, implementation details.
The net result of this new paradigm is that all Eclipse plug-ins and RCP applications are nothing more than a set of isolated modules that gravitate around the Eclipse core.
Another interesting thing about this architecture is that even the communication between these plug-ins is formalized. Not only does the plug-in model offer all the benefits of dependency injection, it also formalizes how you can receive notifications from other plug-ins, how you can emit notifications yourself and more importantly, hides all the details pertaining to upgrades, classloading, and, of course, provides an impressive set of functionalities that cover everything you will ever need for a client-side application, including integration with the host operating system (Windows, MacOS and GTK/Gnome).
Thanks to Eclipse and the RCP, Java is finally on its way toward having a true component model. Still not as powerful as COM (only in-process mode is supported), but definitely one step closer.
The TestNG IDEA plug-in has an interesting feature that I just implemented in the Eclipse plug-in: if you press Ctrl-1 (Quick Fix) on a JUnit test class, the plug-in will give you the option to convert it to TestNG, either with JDK5 annotations:
or JavaDoc annotations:
And that's it! These are fairly simple changes and again, I am struck at how intuitive the Eclipse API is. Manipulating the AST is a real pleasure and as you can see above, the ASTRewriter gives you a lot of goodies for free, among which unlimited undo and a nice preview window.
Guido von Rossum is considering adding interfaces to Python. In this article, he explains that the power of interfaces has forced a few major Python projects to implement their own version of interfaces, which is probably a sign that such a feature is needed in Python itself.
Mix-ins are strikingly absent from Guido's discussion and I really wonder why. Mix-ins don't exactly address the same need as interfaces but they are a better fit for scripting languages where concrete and granular software contracts are more important then schemas.
I actually happen to think that mix-ins would be a very welcome addition to Java as well and I can think of many times when I have needed the functionality provided by a set of methods and I was forced to use one of the following three workarounds:
Here is a concrete example of this problem.
Imagine that some of your classes need to expose the properties "shortName" and "longName" with getters and setters. While interfaces let you specify this contract easily (an interface with four methods), you still need to find a way to capture this implementation in a separate class.
Let's start with the obvious:
public class Nameable {
private String m_shortName;
private String m_longName;
public String getShortName() {
return m_shortName;
}
public void setShortName(String s) {
m_shortName = s;
}public String getLongName() {
return m_longName;
}
public void setLongName(String s) {
m_longName = s;
}
}
At this point, Java forces you to use one of the three techniques described above, but imagine we could do the following:
public class Employee {
import com.beust.Nameable; // illegal Java
// ...
}
Importing the class inside your own class is equivalent to doing a copy/paste of the content of the imported class, so that the following becomes valid:
Employee e = new Employee();
e.setShortName("Cedric");
e.setLongName("Cedric Beust");
There are a lot of things to like about this approach:
One might argue that the methods imported are not obvious in your class, but this is no different from regular inheritance, and IDE's can show the imported methods just as easily.
Once the concept of mix-ins is made available to you, you start looking at your code in very different ways and just when you thought you had done a pretty good job at creating small modular classes that interact nicely with each other and isolate the responsibilities in clear ways, you start realizing that you could decompose your architecture much further. Interfaces allowed you to create a nice abstract schema of your code and mix-ins give you the power to create a nice concrete decomposition as well. It's code reuse at its best.
If you take this concept far enough, you end up with "Quantum Software Design", software that is made of a lot of very tiny pieces that you can mix and match at your leisure without compromising your architecture.
I already used the term "Quantum AOP" a couple of years ago to describe software made of tiny aspects that get woven together to create the final product. This is a very similar concept except that instead of using AOP as the glue, we use a simple, albeit hypothetical as of today, feature of the Java language: internal class imports.
Interestingly, Quantum Software Design is also a technique that I started identifying recently in my Java code, but this time tied to a totally different framework. I'll keep the name of this framework secret for now so I can dedicate an entire entry to it very soon.
The TestNG team is happy to announce the release of TestNG 2.5.
Highlights of this release:
The full list of changes is included below.
The Eclipse plug-in has also been updated (2.5.0) and is available from the
update site (http://beust.com/eclipse) or downloadable as a zip file from
http://testng.org.
Thanks a lot to everyone who contributed to this release, it's a pretty major
step for TestNG!
Change list for TestNG
2.5
Core
We're going global with this baby...
A discussion recently started on the comp.lang.ruby mailing-list about the possibility to port TestNG to Ruby.
While Ruby doesn't support annotations natively, it's actually quite easy to simulate and both Aslak and a participant of this thread have posted a technique to add annotations to Ruby. For example:
config :after_test => true
def teardown
puts "Test2#teardown called"
end
test :groups => ['one']
def test_method1
puts "Test2#test_method1 called"
end
This trick relies on the fact that it's possible to add definitions to Class in Ruby. The annotations config and test above are actually real methods that update fields added to the Class class. When one of these methods is encountered in a Class definition, it is parsed and then silently discarded so it never actually gets added to the Class definition. This is made possible by overriding the method_added method of the Class class, where you can control what to do whenever a new method definition is found by the parser.
You can find the full listing for an example implementation of this technique in this message from Ryan Leavengood.
I also suggested to replace testng.xml with a Ruby file containing these definitions (the Ruby community is usually not very friendly to XML file, and I can certainly sympathize with this feeling).
I'm curious to see where all this will lead...
I am a big fan of single return point functions. Instead of:
public int dilbert() {
if (...) {
...
return 1;
}
else {
...
return 0;
}
I prefer:
public int dilbert() {
int result = 0;
if (...) {
result = 1;
}
return result;
}
There are several advantages to this approach:
However, I started questioning this habit in a particular case: when the failure in a condition should cause the method to abort right away. Compare:
public void dogbert1(Boss b) {
if (b != null) {
...
}
}
with:
public void dogbert2(Boss b) {
if (b == null) return;
...
}
Until recently, I used to favor the first form because, again, it made the execution flow more obvious. If you make the second method more complicated and you start peppering returns a bit everywhere, it can become quite difficult to read.
The problem is that dogbert1() can also be difficult to read because "it leaves you dangling".
When you read the first if in dogbert1(), you make a mental note that there might be an else case further down and you will keep it in the back of your mind as you read the body of the if. When you start adding several nested ifs, the mental state you need to store to understand the method is increasing, and if these else clauses are going to be empty, I would argue that the "early abort idiom" is probably a better choice.
Having said that, I believe there is a happy medium between these two conventions, so I would recommend using the early abort idiom only when... well, it really is about an early abort. If your abort logic has to end up buried down a few nested levels and that it's only one of many other possible cases, you might want to refactor your code so that the abort logic will be featured prominently at the top of your method, as shown above.
What do you think? In the code you read on a daily basis, what form is more prevalent?