Python+Selenium+Unittest+HTMLTestRunner生成测试报告+发送至邮箱,记一次完整的cnblog登录测试示例,

测试思路:单个测试集、单个测试汇成多个测试集、运行测试集、生成测试报告、发送至邮箱。

第一步:建立单个测试集,以cnblog登录为例。

测试用例:

cnblog的登录测试,简单分下面几种情况:
(1)用户名、密码正确
(2)用户名正确、密码不正确
(3)用户名正确、密码为空
(4)用户名错误、密码正确
(5)用户名为空、密码正确

头文件:

import unittest
from selenium import webdriver
import time

 

 1 #coding:utf-8
 2 import unittest
 3 from selenium import webdriver
 4 import time
 5 
 6 class Test(unittest.TestCase):
 7     @classmethod
 8     def setUpClass(cls):
 9         print("开始测试")
10     @classmethod
11     def tearDownClass(cls):
12         print("结束测试")
13     def setUp(self):
14         print("开始单个测试用例")
15     def tearDown(self):
16         print("结束单个测试用例")
17         # 定义登录方法
18     def login(self, username, password):
19         self.dr = webdriver.Firefox()
20         self.dr.get('https://passport.cnblogs.com/user/signin')  # cnblog登录页面
21         self.dr.find_element_by_id('input1').send_keys(username) 
22         self.dr.find_element_by_id('input2').send_keys(password)
23         self.dr.find_element_by_id('signin').click()
24 
25     def test_login_success(self):
26         '''用户名、密码正确'''
27         self.login('木xxxx', 'sxxxxx')  # 正确用户名和密码
28         time.sleep(10)              #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
29         link = self.dr.find_element_by_id('lnk_current_user')
30         self.assertTrue('木秀于林' in link.text)  # 用assertTrue(x)方法来断言  bool(x) is True 登录成功后用户昵称在lnk_current_user里
31 
32     def test_login_pwd_error(self):
33         '''用户名正确、密码不正确'''
34         self.login('木秀xxx', 'pwerror')  # 正确用户名,错误密码
35         time.sleep(10) #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
36         error_message = self.dr.find_element_by_id('tip_btn').text
37         self.assertIn('用户名或密码错误', error_message)  # 用assertIn(a,b)方法来断言 a in b  '用户名或密码错误'在error_message里
38         self.dr.get_screenshot_as_file("F:\\login_pwd_error.jpg")
39 
40     def test_login_pwd_null(self):
41         '''用户名正确、密码为空'''
42         self.login('木秀xxx', '')  # 密码为空
43         error_message = self.dr.find_element_by_id('tip_input2').text
44         self.assertEqual(error_message, '请输入密码')  # 用assertEqual(a,b)方法来断言  a == b  请输入密码等于error_message
45         self.dr.get_screenshot_as_file("F:\\login_pwd_null.jpg")
46 
47     def test_login_user_error(self):
48         '''用户名错误、密码正确'''
49         self.login('usernameerror', 'sxxxxxxx')  # 密码正确,用户名错误
50         time.sleep(10)  #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
51         error_message = self.dr.find_element_by_id('tip_btn').text
52         self.assertIn('用户名或密码错误', error_message)  # 用assertIn(a,b)方法来断言 a in b
53         self.dr.get_screenshot_as_file("F:\\login_user_error.jpg")
54 
55     def test_login_user_null(self):
56         '''用户名为空、密码正确'''
57         self.login('', 'sunsea1.')  # 用户名为空,密码正确
58         error_message = self.dr.find_element_by_id('tip_input1').text
59         self.assertEqual(error_message, '请输入登录用户名')  # 用assertEqual(a,b)方法来断言  a == b
60         self.dr.get_screenshot_as_file("F:\login_user_null.jpg")
61 
62 if __name__=="__main__":
63     unittest.main()

第二步,建立多个测试用例集

test02.py为第一步建立的单个测试集

test01.py/test03.py/test04.py 为示例测试集

test01.py代码如下:

 1 #coding:utf-8
 2 import unittest
 3 import time
 4 
 5 class Test(unittest.TestCase):
 6     @classmethod
 7     def setUpClass(cls):
 8         print("开始测试")
 9     def tearDown(self):
10         print("测试结束")
11     def test01(self):
12         '''测试0201'''
13         print("执行测试用例1")
14     def test02(self):
15         '''测试0202'''
16         print("执行测试用例02")
17 
18 if __name__=="__main__":
19     unittest.main()

测试集结构图如下

 

第三步 将所有多个测试集联合起来,一起执行并生成测试报告html文档

在logintest文档下方建立run_all_case.py

头文件:

 

import unittest
import HTMLTestRunner
from send_email import main2 #这是自己写的发送邮件函数

 

 1 #coding:utf-8
 2 import unittest
 3 import os
 4 import HTMLTestRunner
 5 from send_email import main2
 6 #待执行用例的目录
 7 def allcase():
 8     case_dir=r"F:\logintest\case"
 9     #case_path=os.path.join(os.getcwd(),"case")
10     testcase=unittest.TestSuite()
11     discover=unittest.defaultTestLoader.discover(case_dir,
12                                                  pattern='test*.py',
13                                                  top_level_dir=None)
14     #discover方法筛选出来的用例,循环添加到测试套件中
15     #print(discover)
16     for test_suite in discover:
17         for test_case in test_suite:
18             #添加用例到testcase
19             print(test_case)
20             testcase.addTest(test_case)
21     return testcase
22 
23 
24 if __name__=="__main__":
25     # runner=unittest.TextTestRunner()
26     # runner.run(allcase())
27     report_path="F:\\result.html"
28     fp=open(report_path,"wb")
29     runner=HTMLTestRunner.HTMLTestRunner(stream=fp,
30                                          title="自动化测试unittest测试框架报告",
31                                          description="用例执行情况:")
32 
33     runner.run(allcase())
34     fp.close()
35     #main2()  #from send_email import main2  发送邮件!

 

 第四步:发送邮件,send_email.py

 1 import smtplib
 2 import os.path as pth
 3 import time
 4 from email.mime.text import MIMEText
 5 from email.header import Header
 6 
 7 def sendEmail(content, title, from_name, from_address, to_address, serverport, serverip, username, password):
 8     msg = MIMEText(content, _subtype='html', _charset='utf-8')
 9     msg['Subject'] = Header(title, 'utf-8')
10     # 这里的to_address只用于显示,必须是一个string
11     msg['To'] = ','.join(to_address)
12     msg['From'] = from_name
13     try:
14         s = smtplib.SMTP_SSL(serverip, serverport)
15         s.login(username, password)
16         # 这里的to_address是真正需要发送的到的mail邮箱地址需要的是一个list
17         s.sendmail(from_address, to_address, msg.as_string())
18         print('%s----发送邮件成功' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
19     except Exception as err:
20         print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
21         print(err)
22 #HEFEN_D = pth.abspath(pth.dirname(__file__))
23 
24 def main2():
25     TO = ['864xxxxxxxxx2@qq.com']
26     config = {
27         "from": "69xxxxxxxx2@qq.com",
28         "from_name": '自动化测试unittest测试框架报告:', 
29         "to": TO,
30         "serverip": "smtp.qq.com",
31         "serverport": "465",
32         "username": "694xxxxxxx@qq.com",
33         "password": "xxxxxxxxxxxx"  # QQ邮箱的SMTP授权码
34     }
35 
36     title = "自动化测试unittest测试框架报告"
37     f = open("F://result.html", 'rb')
38     mail_body = f.read()
39     f.close()
40     sendEmail(mail_body, title, config['from_name'], config['from'], config['to'], config['serverport'], config['serverip'],
41               config['username'], config['password'])
42 
43 #main2()

 最后,邮件效果图和html报告如下:

咦!失败了一个。查看截图发现,博客园当用户名错误时,提示的是:用户名不存在,测试用例的预期值是:用户名或密码错误

 

分析:

用户名或密码错误时都不能直接提示用户名错误、密码错误。要含蓄的提示用户名或密码错误,cnblog当用户名错误时提示:用户名不存在,密码错误时:提示 用户名或密码错误,当提示用户名或密码错误时,

也就是用户名实际是正确的,再单方面通过破解密码即可破解账户

提示算是一个安全漏洞,不写了,博主得给cnblog提bug去了

 

posted @ 2018-02-27 17:10  木秀  阅读(6442)  评论(0编辑  收藏  举报