Java testing and "test first development"
My first posting drew a question "does Sun use 'test first development' practices". So, let's talk about that a bit.
I can only speak for the Java team as that's where I work. You have to remember that Java is a 10+ year old project with a lot of history. "History" can mean, as it does in this case, that procedures we've been following for 10+ years often interferes with adopting the latest-and-greatest of development methodologies. Maybe.
I'm going to remain at the high-level picture of what we do.
There's generally 4 areas where Java tests come from:
- Conformance (JCK): The conformance tests (a.k.a. JCK) are derived from minute-level examination of the available spec's. The Java TCK (a.k.a. JCK) is used by any licensee (including Sun) to verify that their Java implementation meets the standard definition of what 'Java' is. The JCK is that definition, in a way.
- Regression (DEV): The regression tests are developed by the Java developers as they fix bugs. Sometimes the regression test is derived from the sample code submitted in the bug report (if any), and other times it's a simple implementation the developer uses to verify the change. The regression suite is meant to find regressions, of course.
- Unit (DEV): This is a relatively new process, and is the "test first" practice asked about. The developers are required to come up with some tests to exercise each feature they develop, and before they can commit the feature (that is, do a "putback") their feature has to pass those unit tests.
- Functional (SQE): The SQE team concentrates on "functional testing", which is trying to look at Java as an application developer. We take the specifications for new features and develop tests which fall outside the above categories.
It's the Unit tests written by the developers that is the closest to the query if Sun does "Test First Development" during the development cycle?
What I'm most familiar with is the functional testing SQE does, as that's the team I've worked in for 7 years. Before joining the SQE team I'd spent 8+ years in different software development jobs, and it was the functional test suites I'd worked on here which gave the most "interesting" software development challenges I'd seen.
As a typical application developer the scope of what you're developing is pretty limited. You have some functionality to develop - e.g. I used to write email applications, and for example there's only a certain amount of functionality to an address book module. Your customer has limited flexibility, because you're giving them a user interface and they can only do what you allow them to do. The small number of options limits the combinatorial expansion of the number of things to test for, etc.
However the customer in our case is the Java developers in the field writing applications using Java. Those application developers have free reign to do whatever they want, only limited by their ability to understand the Java platform and writing software to use it. The immensely larger number of options our customers have mean for an immensely bigger combinatorial expansion on the number of things to test.
That means that when an SQE team member is writing tests for a feature - we have to understand the feature from many, many angles. Most of Java's features can be used in lots of ways, and are never used in isolation from other features.
This last point makes for an interesting distinction between unit testing and functional testing. Unit testing concentrates on individual pieces of functionality, and verifying that each piece works. But you could have a zillion pieces, all individually tested and validated. However the product could still have bad quality unless you verify the individual functions all work together. This is where functional testing comes in, to bring the functionality together and test it in a way that more closely resembles the real world use of Java than you would capture in a Unit test.