[TIP] Asserting side effects for an integration test
C. Titus Brown
ctb at msu.edu
Thu Dec 24 08:18:49 PST 2009
On Thu, Dec 24, 2009 at 11:16:27AM -0500, Doug Hellmann wrote:
> On Dec 24, 2009, at 10:49 AM, Shawn Dahlen wrote:
>> I'm looking for some advice on how to assert a side effect produced by
>> testing a function. Specifically, our project has a set of command
>> objects that internally use SQLAlchemy for database access. We would
>> like to have a set of integration tests that load a fixture (using the
>> Fixture project) into the database, execute the command, and assert the
>> results. For commands that return the result, this is straightforward.
>> However, we are debating how to assert commands that create, update, or
>> delete data.
>> Option 1: In the test, call the CreateCommand then call the
>> GetItemsCommand asserting that the item count has increased. This
>> keeps our test unaware of the implementation detail but it breaks
>> isolation for testing the CreateCommand. My current thought is that
>> this would be ok since it is an integration test.
>> Option 2: In the test, call the CreateCommand. Subsequently, use a
>> SQLAlchemy query in the test to assert the change in database state.
>> This would keep each test isolated, but it now exposes implementation
>> Your advice would be appreciated. Thanks.
> I would go with option 1. Create it using your API, then query for the
> thing you created using your API to make sure it is there.
What if your API is systematically lying to you?
I'd probably go with #2, unless you find that you're changing implementation
details a lot.
C. Titus Brown, ctb at msu.edu
More information about the testing-in-python