Mike wrote:


On Thu, Jun 4, 2009 at 4:40 AM, Terry Reedy <tjre...@udel.edu <mailto:tjre...@udel.edu>> wrote:

    Mike wrote:

        Hello,

        I'm writing an application that needs to fetch a json file from
        a webserver. I'm writing the tests and have a question:

        if I have the following methods:

        def test_headers(self):
           headers = libary.get_data(data)
           check header status


    With no json experience specifically....

    Checking I/O is nasty since the test running correctly depends on
    external resources running correctly and not just your program.  I
    would separate I/O tests from 'process the data' checks and do the
    latter with canned data.  If the canned data built into the test is
    the same as that on the test server, then testing the fetch is an
    equality test.

Thanks, I think I need to separate the tests.

The way JSON works is: Open a url with a request <- this returns a file like object, the JSON libary reads the file like object and returns a list of dictionary objects.

So first I want to make sure when I do the request I get a 200 OK response, second I want to make sure the JSON object matches my predefined object for it (to ensure no API changes).

I think I'll have an external test, which will do two calls (unless I can use the result of the response check test). And if this test passes I will then run my mock test which tests for functionality (and can be run offline). If the first fails then its an indication that the api may have changed and I need to change my mocks.

Is this a good testing method/ approach?

Let us back up a bit. The purpose of a unit test is to test a unit of functionality that you have written code for -- usually with the assumption, possibly false, that the interpreter and libraries are bug-free with respect to your usage. Without knowing what you have written, and therefore, what you should be testing, I am reluctant to say more than that you seem to be on the right track. But some of what you say above seems to be describing higher level integration testing, in particular, interfacing with a changing environment.

One thing I will say: once you have tests passing, you can change either your code or the system-code-data it works with, but should not do both (lest you drive yourself mad). The point of mock objects is to have a stable environment in which to work. So I would try to separate 'testing my code (which I control)' from 'testing for undisclosed changes in external servers (that I do not control)'.

Terry Jan Reedy


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to