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

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

测试用例:

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

头文件:

import unittest
from selenium import webdriver
import time
 #coding:utf-8
 import unittest
 from selenium import webdriver
 import time

 class Test(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         print("开始测试")
     @classmethod
     def tearDownClass(cls):
         print("结束测试")
     def setUp(self):
         print("开始单个测试用例")
     def tearDown(self):
         print("结束单个测试用例")
         # 定义登录方法
     def login(self, username, password):
         self.dr = webdriver.Firefox()
         self.dr.get('https://passport.cnblogs.com/user/signin')  # cnblog登录页面
         self.dr.find_element_by_id('input1').send_keys(username)
         self.dr.find_element_by_id('input2').send_keys(password)
         self.dr.find_element_by_id('signin').click()

     def test_login_success(self):
         '''用户名、密码正确'''
         self.login('木xxxx', 'sxxxxx')  # 正确用户名和密码
         time.sleep(10)              #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
         link = self.dr.find_element_by_id('lnk_current_user')
         self.assertTrue('木秀于林' in link.text)  # 用assertTrue(x)方法来断言  bool(x) is True 登录成功后用户昵称在lnk_current_user里

     def test_login_pwd_error(self):
         '''用户名正确、密码不正确'''
         self.login('木秀xxx', 'pwerror')  # 正确用户名,错误密码
         time.sleep(10) #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
         error_message = self.dr.find_element_by_id('tip_btn').text
         self.assertIn('用户名或密码错误', error_message)  # 用assertIn(a,b)方法来断言 a in b  '用户名或密码错误'在error_message里
         self.dr.get_screenshot_as_file("F:\\login_pwd_error.jpg")

     def test_login_pwd_null(self):
         '''用户名正确、密码为空'''
         self.login('木秀xxx', '')  # 密码为空
         error_message = self.dr.find_element_by_id('tip_input2').text
         self.assertEqual(error_message, '请输入密码')  # 用assertEqual(a,b)方法来断言  a == b  请输入密码等于error_message
         self.dr.get_screenshot_as_file("F:\\login_pwd_null.jpg")

     def test_login_user_error(self):
         '''用户名错误、密码正确'''
         self.login('usernameerror', 'sxxxxxxx')  # 密码正确,用户名错误
         time.sleep(10)  #这里等待10秒的原因是由于cnblog存在验证机制,不想在验证码上花过多时间写代码,博主在等待时间手动处理。
         error_message = self.dr.find_element_by_id('tip_btn').text
         self.assertIn('用户名或密码错误', error_message)  # 用assertIn(a,b)方法来断言 a in b
         self.dr.get_screenshot_as_file("F:\\login_user_error.jpg")

     def test_login_user_null(self):
         '''用户名为空、密码正确'''
         self.login('', 'sunsea1.')  # 用户名为空,密码正确
         error_message = self.dr.find_element_by_id('tip_input1').text
         self.assertEqual(error_message, '请输入登录用户名')  # 用assertEqual(a,b)方法来断言  a == b
         self.dr.get_screenshot_as_file("F:\login_user_null.jpg")

 if __name__=="__main__":
     unittest.main()

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

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

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

test01.py代码如下:

 #coding:utf-8
 import unittest
 import time

 class Test(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         print("开始测试")
     def tearDown(self):
         print("测试结束")
     def test01(self):
         '''测试0201'''
         print("执行测试用例1")
     def test02(self):
         '''测试0202'''
         print("执行测试用例02")

 if __name__=="__main__":
     unittest.main()

测试集结构图如下

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

在logintest文档下方建立run_all_case.py

头文件:

import unittestimport HTMLTestRunnerfrom send_email import main2  #这是自己写的发送邮件函数
 #coding:utf-8
 import unittest
 import os
 import HTMLTestRunner
 from send_email import main2
 #待执行用例的目录
 def allcase():
     case_dir=r"F:\logintest\case"
     #case_path=os.path.join(os.getcwd(),"case")
     testcase=unittest.TestSuite()
     discover=unittest.defaultTestLoader.discover(case_dir,
                                                  pattern='test*.py',
                                                  top_level_dir=None)
     #discover方法筛选出来的用例,循环添加到测试套件中
     #print(discover)
     for test_suite in discover:
         for test_case in test_suite:
             #添加用例到testcase
             print(test_case)
             testcase.addTest(test_case)
     return testcase

 if __name__=="__main__":
     # runner=unittest.TextTestRunner()
     # runner.run(allcase())
     report_path="F:\\result.html"
     fp=open(report_path,"wb")
     runner=HTMLTestRunner.HTMLTestRunner(stream=fp,
                                          title="自动化测试unittest测试框架报告",
                                          description="用例执行情况:")

     runner.run(allcase())
     fp.close()
     #main2()  #from send_email import main2  发送邮件!

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

 import smtplib
 import os.path as pth
 import time
 from email.mime.text import MIMEText
 from email.header import Header

 def sendEmail(content, title, from_name, from_address, to_address, serverport, serverip, username, password):
     msg = MIMEText(content, _subtype='html', _charset='utf-8')
     msg['Subject'] = Header(title, 'utf-8')
     # 这里的to_address只用于显示,必须是一个string
     msg['To'] = ','.join(to_address)
     msg['From'] = from_name
     try:
         s = smtplib.SMTP_SSL(serverip, serverport)
         s.login(username, password)
         # 这里的to_address是真正需要发送的到的mail邮箱地址需要的是一个list
         s.sendmail(from_address, to_address, msg.as_string())
         print('%s----发送邮件成功' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
     except Exception as err:
         print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
         print(err)
 #HEFEN_D = pth.abspath(pth.dirname(__file__))

 def main2():
     TO = ['864xxxxxxxxx2@qq.com']
     config = {
         "from": "69xxxxxxxx2@qq.com",
         "from_name": '自动化测试unittest测试框架报告:',
         "to": TO,
         "serverip": "smtp.qq.com",
         ",
         "username": "694xxxxxxx@qq.com",
         "password": "xxxxxxxxxxxx"  # QQ邮箱的SMTP授权码
     }

     title = "自动化测试unittest测试框架报告"
     f = open("F://result.html", 'rb')
     mail_body = f.read()
     f.close()
     sendEmail(mail_body, title, config['from_name'], config['from'], config['to'], config['serverport'], config['serverip'],
               config['username'], config['password'])

 #main2()

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

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

分析:

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

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

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

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

  1. Python 3+selenium+unittest+HTMLTestRunner生成测试报告

    一.下载HTMLTestRunner.py,解压,将它放到 python安装路径的site-packages目录下 https://pan.baidu.com/s/1epWlibxbxWlNoIcxL ...

  2. Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件

    1.UI测试框架搭建-目录结构 2. 文件介绍 2.1.baseinfo->__init__.py 配置文件定义基础参数 #-*-coding:utf-8-*- #测试用例配置参数 base_u ...

  3. 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试

    Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...

  4. 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试

    Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化 ...

  5. Python htmlTestRunner生成测试报告Demo

    #该代码段是ReadTxt_demo.py 的代码,用户读取txt 文件中的用户信息. #ReadTxt_demo.py def readTxt(filePath): fo = open(filePa ...

  6. selenium自动化测试、Python单元测试unittest框架以及测试报告和日志输出

    部分内容来自:https://www.cnblogs.com/klb561/p/8858122.html 一.基础介绍 核心概念:test case, testsuite, TestLoder,Tex ...

  7. Appium python自动化测试系列之使用HTMLTestRunner生成测试报告(十三)

    ​13.1 测试报告概述 13.1.1 测试报告的定义 在前面章节我们已经讲了自动化基础的很多东西,如果说掌握了,而且自己动手去练习了,我相信在一些初级的面试中是没任何问题的,今天我们接触的应该算是一 ...

  8. python之单元测试_生成测试报告

    (1)HTMLTestRunner.py的下载路径:https://pan.baidu.com/s/1Yk2E8d8bIo5_rmpussOE9Q 提取码:0jae (2)HTMLTestRunner ...

  9. Python+Excel+Unittest+HTMLTestRunner实现数据驱动接口自动化测试(一)

    整个流程: 使用HTMLTestRunner的Run方法执行用例,用例调用Excel读取方法,将测试数据导入到unittest用例中执行,测试结果返回给HTMLTestRunner. 因为刚接触接口自 ...

随机推荐

  1. spring-boot 和 docker 集成

    描述 java 的 Spring是一个很火的框架,Spring boot 这个也不用说了,Docker 近年也很火热, 本文就介绍下我在 Spring boot + Docker的集成一些经验 :) ...

  2. 移动开发--Hybrid和Native混合开发-->HybridApp 、NativeApp、WebApp

    1.1.     APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等).金融(各手机行业.P2P借贷等).医疗(智慧医疗).交通(滴滴.Uber等).教育(慕课网 ...

  3. SQL Server 2008 R2——创建函数 筛选出字符串中的数字 筛选出字符串中的非数字

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  4. QuerySet转化为JSON

    import json data = json.dumps(list(my_table.objects.all().values())) return HttpResponse(data)

  5. 【LeetCode】242 - Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  6. asp.net 中插入数据到access

    这样报语法错误: insert into Menu_wx(userid,menutype,MenuID,menuname,MenuTitle,Url,Key,OrderValue,State) val ...

  7. 教程-Delphi第三方控件安装卸载指南

    1 只有一个DCU文件的组件.DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误.也正是因为没有源 ...

  8. shell用if

    --------- shell用if出错了,Why? shell if 实例: site=github.com/fankcoder if [ $site == github.com/fankcoder ...

  9. 如何查询一个库文件属于哪个rpm包

    1.如果这个库文件已经存在 使用rpm命令: # rpm -qf  /file/path  (绝对路径) 例如: # rpm -qf /lib/libm.so.6 glibc-2.12-1.47.el ...

  10. 无JavaScript实现选项卡轮转切换效果

    CSS:   .box{width:200px; height:100px; border:1px solid #ddd; overflow:hidden;}.list{width:200px; he ...