通过前面的学习,我们已经学会了两个知识点,如何利用 Python 实现发邮件功能,如何查找目录下

最新的文件。下面要做的事情就是把这些功能整合到 all_test.py 文件。

all_test.py

#coding=utf-8

import smtplib

from email.mime.text import MIMEText

import unittest

import HTMLTestRunner

import time,os

#=============定义发送邮件==========

def send_mail(file_new):

#发信邮箱

mail_from='testingwtb@126.com'

#收信邮箱

mail_to='xiaoming@126.com'

#定义正文

f = open(file_new, 'rb')

mail_body = f.read()

f.close()

msg=MIMEText(mail_body,_subtype='html',_charset='utf-8')

#定义标题

msg['Subject']=u"自动化测试报告"

#定义发送时间(不定义的可能有的邮件客户端会不显示发送时间)

msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')

smtp=smtplib.SMTP()

#连接 SMTP 服务器,此处用的 126 的 SMTP 服务器

smtp.connect('smtp.126.com')

#用户名密码

smtp.login('testingwtb@126.com','123456')

smtp.sendmail(mail_from,mail_to,msg.as_string())

smtp.quit()

print 'email has send out !'

#======查找测试报告目录,找到最新生成的测试报告文件====

def send_report(testreport):

result_dir = testreport

lists=os.listdir(result_dir)

lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn))

#print (u'最新测试生成的报告: '+lists[-1])

#找到最新生成的文件

file_new = os.path.join(result_dir,lists[-1])

print file_new

#调用发邮件模块

send_mail(file_new)

#================将用例添加到测试套件===========

def creatsuite():

testunit=unittest.TestSuite()

#定义测试文件查找的目录

test_dir='.\\test_case'

#定义 discover 方法的参数

discover=unittest.defaultTestLoader.discover(test_dir,pattern

='test*.py',top_level_dir=None)

#discover 方法筛选出来的用例,循环添加到测试套件中

for test_case in discover:

print test_case

testunit.addTests(test_case)

return testunit

if __name__ == '__main__':

now = time.strftime("%Y-%m-%d %H_%M_%S")

testreport = 'E:\\test_object\\report\\'

filename = testreport+now+'result.html'

fp = file(filename, 'wb')

runner =HTMLTestRunner.HTMLTestRunner(

stream=fp,

title=u'自动化测试报告',

description=u'用例执行情况:')

alltestnames = creatsuite()

runner.run(alltestnames)

fp.close() #关闭生成的报告

send_report(testreport) #发送报告

send_mail(file_new)

定义一个 sentmail()发邮件函数,接收一个参数 file_new,表示接收最新生成的测试报告文件。

open(file_new, 'rb')

以读写(rb)方式打开最新生成的测试报告文件。

mail_body = f.read()

读取文件内容,将内容传递给 mail_body。

MIMEText(mail_body,_subtype='html',_charset='utf-8')

文件内容写入到邮件正文中。html 格式,编码为 utf-8。

send_report()

定义 sendreport()接收一个测试报告的目录,找到目录下最新生成的测试报告文件 file_new。调用

并将 file_new 传给 send_mail()函数。

程序执行过程:

执行 all_tests.py 文件,执行过程如下:

首先,调用 creatsuit()函数,将所测试用例装载到测试套件中。

其次,调用 HTMLTestRunner 模块的 run()函数,执行测试套件中的用例,并生成测试报告,然后,

fp.close()关闭生成的测试报告文件。

接着,调用 send_report()函数,查找测试报告目录下面最新生成的测试报告文件,并将最新报告文

件的路径传给 send_mail()函数,send_mail()函数实现发邮件功能。

整个过程执行完成,打开我们的接收邮箱将看到最新测试执行的测试报告。

小结:

本章讲解了三个知识点对自动化测试项目的进行了增加,首先引入 HTMLTestRunner 第三方模块,可

以使 unittest 单元测试结果生成更易读的 HTML 报告。在定时任务中,分别介绍了通过 Python 程序和

Windows、Linux 系统所提供的定时任务的方法。在自动发邮件的小节中学会了如何 Python 实现一个发邮

件的功能。

Selenium Grid2

在 Selenium 家族中,我们已经学习了 WebDriver 和 IDE ,这一章介绍最后一位成员 Grid。利用 Grid

可以在不同的主机上建立主节点(hub)和分支节点(node)。使主节点上的测试用例在不同的分支节点

上运行。对于不同的节点来说,可以搭建不同的环境(浏览器/操作系统),从而使一份测试用例完成在不

同环境下的验证。

Selenium-Grid 版本

selenium-grid 分为版本 1 和版本 2,其实它的 2 个版本并不是和 selenium 的版本 1 和 2 相对应发布

的(即 selenium-grid2 的发布比 selenium2 要晚一点)。不过幸运的是现在的 selenium-grid2 基本能支

持 selenium2 的所有功能了。

selenium 虽然分 1 和 2,但其实原理和基本工作方式都是一样的。只是版本 2 同时支持 selenium1 和

selenium2 两种协议,并且在一些小的功能和易用性上进行了优化。比如:指定测试平台的方式。

selenium grid2 已经集成到 selenium server 中了(即 selenium-server-standalone-XXX.jar 包

中)所以,我们不用单独下载与安装 selenium grid。