If you're using Django's unit/doc testing functionality, you would typically be running those tests manually on your local machine. This week, I decided that I wanted to run these nightly from our integration server, and send failures to the dev team.

The easiest way I could think of to do this was to write a little python script. You could run this script nightly using cron, or you could even run it on every commit as a post-build hook in your continuous integration tool.

#!/usr/bin/python
from optparse import OptionParser
import smtplib
from email.mime.text import MIMEText
import settings
import commands

def getOptions():
    arguments = OptionParser()
    arguments.add_option("--email", action="store_true", dest="email_failures", help="Send email failure reports")
    return arguments.parse_args()[0]

def send_email(body):
    message = MIMEText(body)
    message["Subject"] = settings.MAIL_SUBJECT_UNITTESTS
    message["From"] = settings.MAIL_FROM
    message["To"] = ", ".join(settings.MAIL_TO)
    smtp = smtplib.SMTP(host=settings.SMTP_HOST)
    smtp.sendmail(settings.MAIL_FROM, settings.MAIL_TO, message.as_string())
    smtp.quit()
                        
if __name__ == '__main__':        
    options = getOptions()
    # STDIN (0), STDOUT (1) and STDERR (2)
    # just output stderr, which has the failures
    exit_code, output = commands.getstatusoutput("../manage.py test --noinput YOURAPPNAME 1>/dev/null")
    # exit_code == 256 (ERROR), 0 (SUCCESS)
    if exit_code != 0 and options.email_failures:
        send_email(output)