Things to Make Writing Tests Easier

Date:2013-03-16
Speaker:Chris Withers

Something to Test

  • Parsing CSV data
  • tempfile.NamedTemporaryFile
    • Write stuff to it
  • python -m unittest discover

Reduce Boilerplate

  • use setUp() and tearDown() (w/ unittest.TestCase objects)

Libs

  • unittest (stdlib)
  • testfixtures
  • mock (hello, again)
  • unittest2

Rich comparisons with testfixtures

Basic comparisons

  • testfixtures.compare
    • Gives you a diff on long strings
    • Displays differences when comparing collections (sets, dicts, etc.)

Generators

  • testfixtures.generator
    • Rich comparison of generators/iterators!
    • Be careful of just comparing by id
    • Be careful when unwinding

Strings

  • testfixtures.StringComparison
    • good for process ids, thread ids
    • Costly (regex): use sparingly

Complex Objects

  • testfixtures.Comparison
    • Compare objects that don’t support comparison (cool?)
    • Comparison('module.SomeClass' == SomeClass(1,2)
    • Useful post-comparison representation
    • You don’t have to compare every attribute!

Registering your own comparison objects

  • testfixtures.comparison.register
  • testfixtures.comparison.compare_sequence
  • Strict comparison
    • Relaxed and useful by default
    • Not always what oyu want, so you canbe strict (strict=True)
  • What about context?
    • No contextual information provided
    • Use the prefix arg:
      • compare(1, 2, prefix='this is what happened:')

Things that print

  • Lots of code writes to stdout/stderr
  • We should test that!
  • testfixtures.OutputCapture
    • with OutputCapture() as output:
    • later... output.compare(...)

Exceptions

  • testfixtures.ShouldRaise
    • with ShouldRaise(): as s
    • later... compare(s.raised, ...

Files and Directories

  • Annoying to setup
  • Have to clean up
  • Difficult to make x-platform
  • Reading/Writing files
    • textfixtures.TempDirectory
    • with TempDirectory() as dir:
    • dir.read(), dir.write(), dir.makedir()
    • dir.check_dir() - Check the dir
    • dir.check_all() - Check contents
    • truly x-platform,

Logging

  • testfixtures.LogCapture
  • Captures logs..
  • with LogCapture() as log
  • later... log.check(..)
  • Capture a certain level, or logger, etc.
  • Uninstall and reinstall to only cap certain code/log events.

Mocking

  • Where do you mock?
  • testfixtures.Replacer
  • testfixtures.not_there
  • testfixtures.replace
    • Mock all kinds of stuff: dict keys, list elements, object attributes
  • mock.Mock, mock.call

Datetimes

  • testfixtures.test_datetime
    • Supports deltas, timezones