python用unittest+HTMLTestRunner的框架测试并生成测试报告
直接贴代码:
import unittest
from selenium import webdriver
from time import sleep
import os
import time # 定义打开浏览器的方法,这里用的是Chrome,火狐为Firfox,IE为Ie,必须在根目录下对应的driver才能调用
dr = webdriver.Chrome()
# 浏览器最大化
dr.maximize_window() # 创建测试类LoginCase,用unittest的测试框架的格式
class LoginCase(unittest.TestCase):
global path
path = 'F:/Python_test/'
# 定义登录方法,被测试用例调用
def login(self, username, password):
# 需要测试的网页
dr.get('https://passport.cnblogs.com/user/signin') # 需要输入的用户名,变量名和方法中的一致,find_element_by_id('input1')为抓取到的用户名的输入框,用谷歌或者火狐F12可以抓取到
dr.find_element_by_id('input1').send_keys(username) # 需要输入的密码,变量名和方法中的一致,find_element_by_id('input2')为抓取到的密码的输入框
dr.find_element_by_id('input2').send_keys(password) # 点击登陆按钮,find_element_by_id('signin')为抓取到的登陆按钮,click()为点击事件
dr.find_element_by_id('signin').click() # 点击登陆按钮 # 定义测试方法,框架中测试方法以test_开头,底下引号中的中文会在报告中显示,利于清楚的知道测试目的 def test_login_success(self):
'''用户名、密码正确'''
self.login('anyXXX', 'XXXXXX') # 调用定义的login方法,传入正确用户名和密码
sleep(1) # 可以用get_screenshot_as_file方法用来截图,可自定义截图后的保存位置和图片命名
dr.get_screenshot_as_file(path + "login_success.jpg") # 定义了一个实际值,用谷歌或者火狐F12可以抓取到登陆后显示的用户名,.text是获取地址的文本值
# assert先判断需要的实际值是否正确,正确,继续运行用例;如果不正确,不继续运行该用例并返回错误
assert dr.find_element_by_id('lnk_current_user').text, '判断的元素错误,请确认!' # 将实际值赋值给一个变量link,方便比较,可自定义
link = dr.find_element_by_id('lnk_current_user').text # 用assertTrue(x)方法来断言,登录成功后预期的值是否和定义的实际值一致
self.assertTrue('anyXXX' in link) def test_login_pwd_error(self):
'''用户名正确、密码不正确'''
self.login('1', '1') # 正确用户名,错误密码
sleep(1)
dr.get_screenshot_as_file(path + "login_password_error.jpg")
assert dr.find_element_by_id("tip_btn").text, '提示信息类型错误!'
error_message = dr.find_element_by_id('tip_btn').text
#self.assertIn('用户名或密码错误', error_message) # 用assertIn(a,b)方法来断言
assert error_message[0:7],'用户名或密码错误' def test_login_pwd_null(self):
'''用户名正确、密码为空'''
self.login('1', '') # 密码为空
sleep(1)
dr.get_screenshot_as_file(path + "login_password_null.jpg")
assert dr.find_element_by_id("tip_input2").text, '提示信息类型错误!'
error_message = dr.find_element_by_id('tip_input2').text
#self.assertEqual(error_message, '请输入密码') # 用assertEqual(a,b)方法来断言
assert error_message, '请输入密码' def test_login_user_error(self):
'''用户名错误、密码正确'''
self.login('1', '1') # 密码正确,用户名错误
sleep(1)
dr.get_screenshot_as_file(path + "login_username_error.jpg")
assert dr.find_element_by_id("tip_btn").text, '提示信息类型错误!'
error_message = dr.find_element_by_id('tip_btn').text
#self.assertIn('该用户不存在', error_message) # 用assertIn(a,b)方法来断言 a in b
assert error_message[0:5], '该用户不存在' def test_login_user_null(self):
'''用户名为空、密码正确'''
self.login('', '1') # 用户名为空,密码正确
sleep(1)
dr.get_screenshot_as_file(path + "login_username_null.jpg")
assert dr.find_element_by_id("tip_input1").text, '提示信息类型错误!'
error_message = dr.find_element_by_id('tip_input1').text
#self.assertEqual(error_message, '请输入登录用户名') # 用assertEqual(a,b)方法来断言
assert error_message,'请输入登录用户名' # 每个test_执行完执行一次tearDown()方法
def tearDown(self):
sleep(1)
# refresh()方法为刷新浏览器
dr.refresh()
# 关闭浏览器
dr.quit() if __name__ == '__main__':
# 导入HTMLTestRunner库,这句也可以放在脚本开头
import HTMLTestRunner # 定义脚本标题,加u为了防止中文乱码 report_title = u'登陆模块测试报告' # 定义脚本内容,加u为了防止中文乱码
desc = u'博客园登陆模块测试报告详情:' # 定义date为日期,time为时间
date = time.strftime("%Y%m%d")
time = time.strftime("%Y%m%d%H%M%S") # 定义path为文件路径,目录级别,可根据实际情况自定义修改
path = 'F:/Python_test/' + date + "/login/" + time + "/" # 定义报告文件路径和名字,路径为前面定义的path,名字为report(可自定义),格式为.html
report_path = path + "report.html" # 判断是否定义的路径目录存在,不能存在则创建
if not os.path.exists(path):
os.makedirs(path)
else:
pass # 定义一个测试容器
testsuite = unittest.TestSuite() # 将测试用例添加到容器
testsuite.addTest(LoginCase("test_login_success"))
testsuite.addTest(LoginCase("test_login_pwd_error"))
testsuite.addTest(LoginCase("test_login_pwd_null"))
testsuite.addTest(LoginCase("test_login_user_error"))
testsuite.addTest(LoginCase("test_login_user_null")) # 将运行结果保存到report,名字为定义的路径和文件名,运行脚本
with open(report_path, 'wb') as report:
runner = HTMLTestRunner.HTMLTestRunner(stream=report, title=report_title, description=desc)
runner.run(testsuite) # 关闭report,脚本结束
report.close() 生成报告为:
python用unittest+HTMLTestRunner的框架测试并生成测试报告的更多相关文章
- python用unittest+HTMLTestRunner+csv的框架测试并生成测试报告
直接贴代码: import csv # 导入scv库,可以读取csv文件from selenium import webdriverimport unittestfrom time import s ...
- Python+selenium+unittest+HTMLTestReportCN单元测试框架分享
分享一个比较基础的,系统性的知识点.Python+selenium+unittest+HTMLTestReportCN单元测试框架分享 Unittest简介 unittest是Python语言的单元测 ...
- Python+Excel+Unittest+HTMLTestRunner实现数据驱动接口自动化测试(一)
整个流程: 使用HTMLTestRunner的Run方法执行用例,用例调用Excel读取方法,将测试数据导入到unittest用例中执行,测试结果返回给HTMLTestRunner. 因为刚接触接口自 ...
- UI测试后生成测试报告,利用shell脚本上传svn
ui测试后生成测试报告,把报告保存在某一个固定路径 shell脚本把这个报告上传 #!/bin/bash -ile #svn下载文件 #svn checkout http://svn.xxx.com/ ...
- Python+Selenium+Unittest+HTMLTestRunner生成测试报告+发送至邮箱,记一次完整的cnblog登录测试示例,
测试思路:单个测试集.单个测试汇成多个测试集.运行测试集.生成测试报告.发送至邮箱. 第一步:建立单个测试集,以cnblog登录为例. 测试用例: cnblog的登录测试,简单分下面几种情况:(1)用 ...
- Appium基于Python unittest自动化测试 & 自动化测试框架 -- PO并生成html测试报告
基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...
- Python + request + unittest实现接口测试框架
1.为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试,如postman.jmeter.fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但 ...
- Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件
1.UI测试框架搭建-目录结构 2. 文件介绍 2.1.baseinfo->__init__.py 配置文件定义基础参数 #-*-coding:utf-8-*- #测试用例配置参数 base_u ...
- python:unittest之跳过测试和预期失败的用例
在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...
随机推荐
- CSS面试复习(三):预处理器、工程化方案、三大框架中的CSS
一.预处理器 1.介绍 基于CSS的另一种语言.通过工具编译成CSS.添加了很多CSS不具备的特性.能提升CSS文件的组织 2.less嵌套 3 .sass嵌套 4. less变量 5.sass变量 ...
- Tomcat7基于redis的session共享
一,项目需求 因开发人员在登录后台时需要反复认证,tomcat反复切换,所以给运维组提出需求,解决session共享问题. 二,解决方法 环境:基于Centos6.8 Jdk 版本 java ve ...
- react路由的安装及格式和使用方法
react路由的安装: 在要创建项目的目录命令窗里输入: cnpm install -g create-react-app create-react-app 项目名 在创建好的项目目录命令窗里输入: ...
- 对Tomcat部署web应用的方式总结
对Tomcat部署web应用的方式总结,常见的有以下四种: 1.[使用控制台部署] 访问Http://localhost:8080,并通过Tomcat Manager登录,进入部署界面即可. 2.[利 ...
- const的引用
const的引用 对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象: ; const int &r1 = ci;//正确:引用及其对应的对象都 ...
- hadoop3.x.x错误解决
错误信息:there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation. 解决方案: (缺少用户定义而造成的)因此编辑启动和关 ...
- ubuntu14.04升级mysql5.5至mysql5.7
原文链接:https://www.cnblogs.com/os-python/p/6842485.html 1.下载mysql-apt的配置包,并安装 wget https://dev.mysql.c ...
- JiBX笔记
注意事项 JiBX:1.2.2 (https://sourceforge.net/projects/jibx/files/jibx/jibx-1.2.2/) JDK:1.6 (http://www.o ...
- [CentOS]Failed to start OpenSSH server daemon
问题描述: 以前一直能够通过Xshell来连接服务器,但是突然连接不上了. 解决思路: 首先通过命令查看SSH服务的状态: systemctl status sshd 可以看到,有错误,但是没有显示详 ...
- 【运维】Dell R710如何开启VT服务
[前言]: 英特尔的硬件辅助虚拟化技术(Virtualization Technology,简称VT技术)是一种设计更简单.实施更高效和可靠的方法. 如果想要在 ...
