unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
* On white-box tests
       [not found] <E1Majpl-0008Ga-T9@cvs.savannah.gnu.org>
@ 2009-08-19  8:38 ` Ludovic Courtès
  2009-08-19 12:14   ` Mike Gran
  0 siblings, 1 reply; 5+ messages in thread
From: Ludovic Courtès @ 2009-08-19  8:38 UTC (permalink / raw)
  To: Michael Gran; +Cc: guile-devel

Hello!

Just a note that I've been meaning to send for some time.

"Michael Gran" <spk121@yahoo.com> writes:

> http://git.savannah.gnu.org/cgit/guile.git/commit/?id=9b0c25f6d18d5be318ea3a47fd87cf7e63b689e1

[...]

> --- a/test-suite/tests/strings.test
> +++ b/test-suite/tests/strings.test

[...]

> +;;
> +;; string internals
> +;;
> +
> +;; Some abbreviations
> +;; BMP - Basic Multilingual Plane (codepoints below U+FFFF)
> +;; SMP - Suplementary Multilingual Plane (codebpoints from U+10000 to U+1FFFF)
> +
> +(with-test-prefix "string internals"
> +
> +  (pass-if "new string starts at 1st char in stringbuf"
> +    (let ((s "abc"))
> +      (= 0 (assq-ref (%string-dump s) 'start))))
> +
> +  (pass-if "length of new string same as stringbuf"
> +    (let ((s "def"))
> +      (= (string-length s) (assq-ref (%string-dump s) 'stringbuf-length))))
> +
> +  (pass-if "contents of new string same as stringbuf"
> +    (let ((s "ghi"))
> +      (string=? s (assq-ref (%string-dump s) 'stringbuf-chars))))
> +
> +  (pass-if "writable strings are not read-only"
> +    (let ((s "zyx"))
> +      (not (assq-ref (%string-dump s) 'read-only))))
> +
> +  (pass-if "read-only strings are read-only"
> +    (let ((s (substring/read-only "zyx" 0)))
> +      (assq-ref (%string-dump s) 'read-only)))
> +
> +  (pass-if "null strings are inlined"
> +    (let ((s ""))
> +      (assq-ref (%string-dump s) 'stringbuf-inline)))

First of all, thanks for taking the time to write unit tests!

I'm not fully convinced by some of these "string internals" tests,
though.  These are "white box tests".  I believe these tests are mostly
useful when written by someone different than the one who implemented
the code under test, both of whom following a given specification.  When
someone writes both the code and the white box tests, I'm afraid they
end up writing the same code twice, just differently.  For example:

  SCM
  scm_i_substring_read_only (SCM str, size_t start, size_t end)
  {
    [...]

    return scm_double_cell (RO_STRING_TAG,  /* <--- read-only */
                            SCM_UNPACK(buf),
                            (scm_t_bits)str_start + start,
                            (scm_t_bits) end - start);
  }

and:

  (pass-if "read-only strings are read-only"
    (let ((s (substring/read-only "zyx" 0)))
      (assq-ref (%string-dump s) 'read-only)))

Thus, I think such tests don't provide much information.

Conversely, for this example, a black-box test of the public API would
have helped catch regressions and non-conformance issues:

  (pass-if-exception exception:read-only-string
    (string-set! (substring/read-only "zyx" 0) 1 #\x))

Another issue is that these tests expose a lot of the implementation
details, e.g.:

  (pass-if "short Latin-1 encoded strings are inlined"
    (let ((s "m"))
      (assq-ref (%string-dump s) 'stringbuf-inline)))

The inline/outline distinction is an implementation detail.  If we
change it (that's something we could get rid of in the BDW-GC branch,
for instance) then the tests will have to be rewritten or removed.

Conversely, black box tests can give confidence that a change in
implementation details did have any user-visible impact.

There *are* situations where the gap between the public API and the
internals is too important, and white box tests can come in handy here
(that's why `%string-dump' et al. are nice tools).  However, often, I
think it's better to have good coverage of the public API than a wealth
of "obvious" white-box tests.

What do you think?

Thanks,
Ludo'.




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: On white-box tests
  2009-08-19  8:38 ` On white-box tests Ludovic Courtès
@ 2009-08-19 12:14   ` Mike Gran
  2009-08-19 13:53     ` Ludovic Courtès
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Gran @ 2009-08-19 12:14 UTC (permalink / raw)
  To: Ludovic Courtès, Guile Devel

On Wed, 2009-08-19 at 10:38 +0200, Ludovic Courtès wrote:
> Hello!
> 
> Just a note that I've been meaning to send for some time.
> 
> "Michael Gran" <spk121@yahoo.com> writes:
> 
> > http://git.savannah.gnu.org/cgit/guile.git/commit/?id=9b0c25f6d18d5be318ea3a47fd87cf7e63b689e1
> 
> [...]
> 

> I'm not fully convinced by some of these "string internals" tests,
> though.  These are "white box tests".  I believe these tests are mostly
> useful when written by someone different than the one who implemented
> the code under test, both of whom following a given specification.  When
> someone writes both the code and the white box tests, I'm afraid they
> end up writing the same code twice, just differently.  For example:

I know what your saying.  I was just a kid with a new toy.

In my line of work, where 100% code coverage of test suites is a common
requirement, we end up writing many such overly obvious tests.  They are
often the only way to hit some internal branches.  They are often
pointless.  

> What do you think?

Keep it or dump it.  It's all good.

> 
> Thanks,
> Ludo'.

Thanks,

Mike





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: On white-box tests
  2009-08-19 12:14   ` Mike Gran
@ 2009-08-19 13:53     ` Ludovic Courtès
  2009-08-19 14:28       ` Mike Gran
  0 siblings, 1 reply; 5+ messages in thread
From: Ludovic Courtès @ 2009-08-19 13:53 UTC (permalink / raw)
  To: guile-devel

Mike Gran <spk121@yahoo.com> writes:

> On Wed, 2009-08-19 at 10:38 +0200, Ludovic Courtès wrote:

[...]

>> What do you think?
>
> Keep it or dump it.  It's all good.

Just to be clear: I think we can keep them, it doesn't hurt.

I just wanted to hear what you and others thought about the issue,
because I think unit tests are a crucial part of software development.

Thanks,
Ludo'.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: On white-box tests
  2009-08-19 13:53     ` Ludovic Courtès
@ 2009-08-19 14:28       ` Mike Gran
  2009-08-19 14:41         ` Ludovic Courtès
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Gran @ 2009-08-19 14:28 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guile-devel

On Wed, 2009-08-19 at 15:53 +0200, Ludovic Courtès wrote:
> Mike Gran <spk121@yahoo.com> writes:
> 
> > On Wed, 2009-08-19 at 10:38 +0200, Ludovic Courtès wrote:

> I just wanted to hear what you and others thought about the issue,
> because I think unit tests are a crucial part of software development.

OK.  To say something slightly more cogent.  I think when a current
phase of development centers around modifying low-level code, it is
useful to have a set of low-level tests.  If those tests fail, it
reminds the developer that s/he has modified something upon which other
routines rely.

I wrote the string-internals tests to indicate to me when I'd done
something that had unexpected side-effects.  They are intentionally
white-box; they are intentionally reflexive.

There is a danger that those tests, should they remain, could be seen as
indicating software requirements, which they do not.  The software
requirement specification for Scheme (RnRS) is high level and leaves
much of the implementation detail unspecified.

I think it is a good idea to leave them in, probably with comments that
express that they test the implementation, not the specification.   I
also think that it is a good idea to segregate them from tests that
exercise the actual software requirements.

But, I can see an equally valid argument for stripping them out once
strings are no longer in flux, for example at release 2.0, assuming it
is bug free ;-) or perhaps 2.1.

Thanks,

Mike




> 
> Thanks,
> Ludo'.
> 
> 
> 





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: On white-box tests
  2009-08-19 14:28       ` Mike Gran
@ 2009-08-19 14:41         ` Ludovic Courtès
  0 siblings, 0 replies; 5+ messages in thread
From: Ludovic Courtès @ 2009-08-19 14:41 UTC (permalink / raw)
  To: guile-devel

Mike Gran <spk121@yahoo.com> writes:

> I wrote the string-internals tests to indicate to me when I'd done
> something that had unexpected side-effects.  They are intentionally
> white-box; they are intentionally reflexive.

OK, I understand now.  Then if it's useful to you, well, it's indeed
useful.  :-)

> But, I can see an equally valid argument for stripping them out once
> strings are no longer in flux,

Makes sense.

> for example at release 2.0, assuming it is bug free ;-) or perhaps
> 2.1.

But I'm sure it'll all be ready by 2.0 or even 1.9.3!  :-)

Thanks,
Ludo'.





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-08-19 14:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <E1Majpl-0008Ga-T9@cvs.savannah.gnu.org>
2009-08-19  8:38 ` On white-box tests Ludovic Courtès
2009-08-19 12:14   ` Mike Gran
2009-08-19 13:53     ` Ludovic Courtès
2009-08-19 14:28       ` Mike Gran
2009-08-19 14:41         ` Ludovic Courtès

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).