[Tutor] How to test a function which runs a passed in function twice?
boB Stepp
robertvstepp at gmail.com
Sun Oct 2 19:45:14 EDT 2016
On Sun, Oct 2, 2016 at 6:00 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> On Sun, Oct 02, 2016 at 05:47:51PM -0500, boB Stepp wrote:
>> In exercise 3.2 of Downey's "Think Python 2" he has a function:
>>
>> def do_twice(f):
>> f()
>> f()
>>
>> As you know, I am trying to learn testing/TDD while doing these
>> exercises. How do I test such a *general* function? Should I create
>> a variety of arbitrary functions in my test file, call the do_twice
>> function with each of these made up functions and see if I get the
>> expected results?
>
> Probably not need to use a variety of functions. Just one is sufficient.
Would you mind on elaborating on why one would be sufficient? I
suppose I am overthinking this. It is just that I can imagine all
kinds of gnarly, over-convoluted functions. Perhaps one of such
theoretical monstrosities would break the function to be tested? But
then again, it seems more like do_twice(f) is just exercising Python's
well-tested function-calling facility, so I probably don't need to get
over-excited about testing do_twice. Have I answered my own question
yet?
>
> def test_dotwice(self):
> storage = []
> def f():
> storage.append(1)
>
> assert storage == []
> do_twice(demo)
> self.assertEqual(storage, [1, 1])
>
>
> Why do I use `assert` the first time, and `assertEqual` the second?
>
> The actual unit test is the assertEqual. That allows the unittest module
> to track errors, etc.
>
> But the first test, `assert storage == []`, is not testing the do_twice
> function. It is testing the internal logic of the test_dotwice code: it
> acts as a checked comment to the reader: storage must be an empty list,
> not just any old list, if it isn't, it will fail. As such, if it
> fails, it is inappropriate to count it as an failure of do_twice. It
> should count as an error in the test itself. Making it an assert makes
> that clear.
This brings to mind something else that I had meant to ask about. I
watched a video of Ned Batchelder giving a talk on unit testing last
week. In passing, at one point, he mentioned that one might need to
test one's test code. And you are providing a little test of your
example test code. When should one test test code? When it stops
being *obviously* straightforward? After all, testing test code can
get recursively ridiculous!
--
boB
More information about the Tutor
mailing list