L505 ha scritto:

Since I don't exactly know what test frameworks are, even after reading about 
them for the
past few years, I'm going to ask some risky questions. This is not a flame 
thrower attempt
at the test framework advocates, I'm just trying to understand what exactly 
they do, from a
"newbie to test frameworks" perspective.
I did not understand the full benefits of unit tests till I've tried them.
And it took a lot to get accustomed to them.

Do test frameworks
-cause you to spend lots of time writing test frameworks instead of program 
code?
The function of the xUnit testing framework is to let you write tests faster and with less effort. It's a matter of personal development habits and preferences of course, but the greatest benefit of unit testing I've experienced was the reduction of time spent with the debugger (I still don't know how to use it effectively with Free Pascal and in Lazarus I usually keep it disabled :) A failing test usually leads me directly to the problem. The safety net provided by the tests, written at the same time as I write the code gives me courage to do the refactoring that I find usefull when I review the code to improve the design, or the changes that I need to apply when I do some profiling. It assures me I've not introduced collateral damage.

-even apply to languages with compilers and strong typing?
I has nothing to do with strong typing IMHO, I love strong typing but it does not solve all my problems. I'm not a perfect programmer, I'm quite successful in making mistakes and I need to be sure that a piece of code does exactly what I thought it should do, without making assumptions and discover the problem later, when the code has been used in other higher level functions or frameworks

-cause you to write your programs to conform to the test framework, instead of 
the program
framework?
Not all kind of code can benefit from unit testing, it's no use in my opinion to try to test the GUI code, and it's difficult to test some parts of web or db applications. But in my case, when I'm doing unit testing of non visual code in more complex frameworks and I find a class that is difficult to test in isolation, I've noticed that in most occasions this is due to some flaw in my design, often the classes proved to be too tightly coupled or had a wrong interface. So, from my experience, writing tests has the side effect to improve the design of my code.

-have any actual statistics of success?
The Free Pascal Compiler is the best example of the success of testing, have you seen how many test have our compiler gods put in place in their testing suite? It's not fpcunit but the effect is the same. It was the first think I've noticed when I checked out the code from cvs the first time. Then I've noticed that each time a bug was found it was pinned down in a test to prevent it to emerge again, and I've begin to learn some other good tricks from them.

-have popularity statistics that prove they are popular (in the Delphi 
community) as stated
in the article?
I'm quite sure that the folks at Borland don't do a lot of unit testing ;) after all DUnit and NUnit are open source products :), but yes, in the open source Delphi community they are quite popular, see the Jedi JCL project that uses DUnit for example:
http://cvs.sourceforge.net/viewcvs.py/jcl/qa/automated/dunit/units/
The developers that took over the InstantObjects framework development are now successfully using FPCUnit to begin to understand the complex IO framework, pinpointing the code to be able to do some changes safely and maybe to pave the way for the Lazarus port. (See http://cvs.sourceforge.net/viewcvs.py/instantobjects/Source/Tests/)

The Mono project is successfully using NUnit too.


-have any real world examples of how they helped personX fix problemY in 
significantly less
time?
It's not about fixing a problem in my experience. It's about maintaining the same level of productivity when the system grows. To be able to do fearless refactoring in the phase of reviewing the code when discovering some "bad smells", to be able to improve the design. I find it difficult to begin some large refactoring without a solid base of tests in place. When I publish some code I prefer to thoroughly test it before and when I submit a bug report I found practical to provide a failing test that isolates it. Unit Tests are not a panacea to all the problems, but they make my work easier. It helped me to drastically reduce the time I've spent debugging. It took some time and effort to learn to write good tests but for me it was a good investment. By doing the tests as I write the code I've learned to spend less time in developing good tests (it's like mowing a lawn, when the grass is small it's easier). It keeps my productivity stable even when the code is getting complex and it even helps me to isolate a reported bug in my code. Now I'm really having fun in coding.

Hoping the answers are no, yes, no yes, yes, yes.
The answer was quite more articulated and subjective :) there's no use in saying that unit testing is good for everyone. If the developer enjoys doing it, as I do, it's a good thing in my opinion. But I'm convinced that there's not one true way of writing good quality software, every one has to find the one best suited to his needs.

Dean

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to