Do everything in Java…
Chris via Digitalmars-d
digitalmars-d at puremagic.com
Fri Dec 5 07:11:29 PST 2014
On Friday, 5 December 2014 at 15:03:39 UTC, Ary Borenszweig wrote:
> On 12/5/14, 9:42 AM, Chris wrote:
>> On Friday, 5 December 2014 at 12:06:55 UTC, Nemanja Boric
>> wrote:
>>>> The good thing about unit tests is that they tell you when
>>>> you break
>>>> existing code.
>>>
>>> That's the great thing about unittests, and the reason why I
>>> write
>>> unittests. I work on a fairly complex code base and every now
>>> and then
>>> there's a new feature requested. Implementing features
>>> involves
>>> several to dozen of modules to be changed, and there's no way
>>> that I
>>> could guarantee that feature implementation didn't change
>>> behaviour of
>>> the existing code. I both hate and love when I `make`
>>> compiles and
>>> unittest fails.
>>>
>>>> But you'll realize that soon enough anyway.
>>>
>>> This is not good enough for me. Sometimes "soon enough" means
>>> week or
>>> two before somebody actually notice the bug in the
>>> implementation
>>> (again, very complex project that's simply not
>>> hand-testable), and
>>> that's definitively not soon enough keeping in mind amount of
>>> $$$ that
>>> you wasted into air.
>>>
>>>
>>>
>>> On Friday, 5 December 2014 at 11:53:11 UTC, Chris wrote:
>>>> On Friday, 5 December 2014 at 09:27:16 UTC, Paulo Pinto
>>>> wrote:
>>>>> On Friday, 5 December 2014 at 02:25:20 UTC, Walter Bright
>>>>> wrote:
>>>>>> On 12/4/2014 5:32 PM, ketmar via Digitalmars-d wrote:
>>>>>>>> http://www.teamten.com/lawrence/writings/java-for-everything.html
>>>>>>> i didn't read the article, but i bet that this is just
>>>>>>> another
>>>>>>> article
>>>>>>> about his language of preference and how any other
>>>>>>> language he tried
>>>>>>> doesn't have X or Y or Z. and those X, Y and Z are
>>>>>>> something like
>>>>>>> "not
>>>>>>> being on market for long enough", "vendor ACME didn't
>>>>>>> ported
>>>>>>> ACMElib to
>>>>>>> it", "out staff is trained in G but not in M" and so on.
>>>>>>> boring.
>>>>>>>
>>>>>>
>>>>>> From the article:
>>>>>>
>>>>>> "Most importantly, the kinds of bugs that people introduce
>>>>>> most
>>>>>> often aren’t the kind of bugs that unit tests catch. With
>>>>>> few
>>>>>> exceptions (such as parsers), unit tests are a waste of
>>>>>> time."
>>>>>>
>>>>>> Not my experience with unittests, repeated over decades
>>>>>> and with
>>>>>> different languages. Unit tests are a huge win, even with
>>>>>> statically typed languages.
>>>>>
>>>>> Yes, but they cannot test everything. GUI code is specially
>>>>> ugly as
>>>>> it requires UI automation tooling.
>>>>>
>>>>> They do exist, but only enterprise customers are willing to
>>>>> pay for it.
>>>>>
>>>>> This is why WPF has UI automation built-in.
>>>>>
>>>>> The biggest problem with unit tests are managers that want
>>>>> to see
>>>>> shiny reports, like those produced by tools like Sonar.
>>>>>
>>>>> Teams than spend ridiculous amount of time writing
>>>>> superfluous unit
>>>>> tests just to match milestone targets.
>>>>>
>>>>> Just because code has tests, doesn't mean the tests are
>>>>> testing what
>>>>> they should. But if they reach the magical percentage
>>>>> number then
>>>>> everyone is happy.
>>>>>
>>>>> --
>>>>> Paulo
>>>>
>>>> Now is the right time to confess. I hardly ever use unit
>>>> tests
>>>> although it's included (and encouraged) in D. Why? When I
>>>> write new
>>>> code I "unit test" as I go along, with
>>>>
>>>> debug writefln("result %s", result);
>>>>
>>>> and stuff like this. Stupid? Unprofessional? I don't know.
>>>> It works.
>>>> I once started to write unit tests only to find out that
>>>> indeed they
>>>> don't catch bugs, because you only put into unit tests what
>>>> you know
>>>> (or expect) at a given moment (just like the old
>>>> writefln()). The
>>>> bugs I, or other people, discover later would usually not be
>>>> caught
>>>> by unit tests simply because you write for your own
>>>> expectations at a
>>>> given moment and don't realize that there are millions of
>>>> other ways
>>>> to go astray. So the bugs are usually due to a lack of
>>>> imagination or
>>>> a tunnel vision at the moment of writing code. This will be
>>>> reflected
>>>> in the unit tests as well. So why bother? You merely
>>>> enshrine your
>>>> own restricted and circular logic in "tests". Which reminds
>>>> me of
>>>> maths when teachers would tell us "And see, it makes perfect
>>>> sense!",
>>>> yeah, because they laid down the rules themselves in the
>>>> first place.
>>>>
>>>> The same goes for comparing your output to some "gold
>>>> standard". The
>>>> program claims to have an accuracy of 98%. Sure, because you
>>>> wrote
>>>> for the gold standard and not for the real world where it
>>>> drastically
>>>> drops to 70%.
>>>>
>>>> The good thing about unit tests is that they tell you when
>>>> you break
>>>> existing code. But you'll realize that soon enough anyway.
>>
>> Yes, yes, yes. Unit tests can be useful in cases like this.
>> But I don't
>> think that they are _the_ way to cope with bugs. It's more
>> like "stating
>> the obvious", and bugs are hardly ever obvious, else they
>> wouldn't be bugs.
>
> Unit tests are not for detecting bugs. They are only useful for:
>
> 1. Making sure things work (a bit).
> 2. Making sure things continue to work when you refactor or
> introduce new code.
> 3. When a new bug is found you can write a test for it that
> will make that bug impossible to ever resurrect.
> 4. Show how code is supposed to be used.
>
> Again, their purpose is not to detect bugs, but to build more
> robust software.
I completely agree with all your points. Point 4 I forgot to
mention, I often look at the unit tests in D source code to see
how it is supposed to be used. All I'm saying is that sometimes
unit tests are sold as the be all end all anti-bug design. I
think they should be used sensibly not everywhere.
More information about the Digitalmars-d
mailing list