当前位置: 首页 > news >正文

selenium(6)-----unittest框架

unittest框架

1)测试固件

1)setUp()是用来初始化测试环境所做的工作

2)tearDown()是用来清理环境所做的工作

2)测试套件

把不同的测试脚本,不同类中的测试用例给组织起来放到一个测试套中执行

3)测试用例的要以test_开头

4)如何使用unittest框架

只需要在脚本中定义一个类,继承于unittest.TestCase即可

verbosity是一个选项,表示测试结果的信息复杂度,有0、1、2 三个值
0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共10个 失败2 成功8
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息

创建两个类进行测试:

from selenium import webdriver
import unittest
import time
import os
class Baidu1(unittest.TestCase):
# 测试固件def setUp(self):print("-----setUp----")self.driver=webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe")self.url="http://www.baidu.com/"self.driver.maximize_window()time.sleep(3)def tearDown(self):print("------tearDown----")self.driver.quit()#     测试用例 忽略测试用例的执行#     @unittest.skip("skipping")def test_hao(self):driver=self.driverurl=self.urldriver.get(url)driver.find_element_by_link_text("hao123").click()time.sleep(3);def test_hbaidu(self):driver=self.driverurl=self.urldriver.get(url)driver.find_element_by_id("kw").send_keys("突如其来的假期")time.sleep(3)driver.find_element_by_id("su").submit()print(driver.title)self.savescreenAsPhoto(driver,".jpg")time.sleep(5)def savescreenAsPhoto(self,driver,file_name):if not os.path.exists("./image"):os.makedirs("./image")now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))driver.get_screenshot_as_file("./image/"+now+"-"+file_name)time.sleep(3)if __name__ == "__main":unittest.main()
# coding = utf8
from selenium import webdriver
import unittest
import time
# 导入By模块
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException
class TestBaiduTwo(unittest.TestCase):def setUp(self):#获得浏览器的驱动self.driver=webdriver.Chrome()#让浏览器窗口最大化self.driver.implicitly_wait(3)self.base_url="http://www.baidu.com/"self.driver.maximize_window()self.array=[]self.flag = Truedef tearDown(self):self.driver.quit()self.assertEqual([],self.array)def test_hao(self):driver=self.driverdriver.get(self.base_url)driver.find_element_by_link_text("新闻").click()time.sleep(3)def test_baidusearch(self):driver=self.driverdriver.get(self.base_url)driver.find_element_by_id("kw").clear()driver.find_element_by_id("kw").send_keys("庆余年")driver.find_element_by_id("su").click()#选择通过什么方式来进行获取元素,value是什么属性self.is_element_present(By.ID, "su").click()time.sleep(3)def is_element_present(self,how,what):try:element=self.driver.find_element(by=how,value=what)except NoSuchElementException as e:return elementreturn elementdef is_alert_present(self):try:self.driver.switch_to.alert()except NoAlertPresentException as e:return Falsereturn Truedef close_alert_and_get_its_text(self):try:#获取到alert弹出框alert=self.driver.switch_to_alert()#获取到alert弹出框中的文字alert_text=alert.textif self.flag:alert.accept()else:alert.dismiss()return alert_textfinally:self.flag = Trueif __name__ == "__main__":unittest.main(verbosity=2)

1)以test_开头命名的方法,是测试方法,在运行整个类的时候会默认执行。
2)unittest提供了全局的main()方法,使用它可以方便地将一个单元测试模块变成可以直接运行的测试脚本main()方法搜索所有包含在该模块中以”test"命名的测试方法,并自动执行他们

unittest里面有四个很重要的概念,test fixture,test case,test suite,test runner
Test Fixture
1)对一个测试用例环境的搭建和销毁,就是一个fixture,通过覆盖setUp()和tearDown()方法来实现,setUp()方法可以进行测试环境的搭建,比如获取待测试浏览器的驱动,或者如果测试中需要访问数据库,那么可以在setUp()中通过建立数据库连接来进行初始化
2)tearDown()方法进行环境的销毁,可以进行关闭浏览器,关闭数据库连接,清除数据库中产生的数据等操作;

Test Case
一个TestCase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括测试前准备环境的搭建(setUp)实现测试过程的代码,以及测试后环境的还原(tearDown)单元测试(unit test)的本质就在这里一个测试用例,就是一个完整的测试单元,可以对某一个功能进行验证

TestSuite

一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行,这个就产生了测试套件TestSuite的概念,Test Suit用来将多个测试用例组装在一起;

test Runner

test Runner测试的执行也是非常重要的一个概念,在unittest框架中,通过TextTestRunner类提供的run()方法来执行test suite/test case

 

addTest()

1)TestSuite类的addTest()方法可以把不同的测试类中的测试方法组装到测试套件中,但是addTest()一次
2)只能把一个类里面的一个测试方法组装到测试套件中 

但是上述做法有两个不方便的地方,阻碍脚本的快速执行,必须每次修改testsuite.py:
1)需要导入所有的相关的py文件,比如 import testbaidu1,每新增一个脚本就需要导入一个
2)addTest一次只能增加一个测试方法,如果一个py文件中有10个测试方式,如果都要组装到测试套件中,就需要增加10次

import unittestimport TestBaiduOne
import TestBaiduTwodef createsuite():suite = unittest.TestSuite()suite.addTest(TestBaiduOne.Baidu1("test_hao"))suite.addTest(TestBaiduTwo.Baidu2("test_baidusearch"))suite.addTest(TestBaiduTwo.Baidu2("test_hao"))return suite
if __name__=="__main__":suite= createsuite()runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)

跑测试套件用例步骤:

1)先进行生成测试套件

2)得到跑测试套件的runner

3)用runner去跑测试套件

 

把一个类中的所有测试用例都添加到一个测试套件里面

1)使用unittest.makeSuite()

def createsuite():suit=unittest.TestSuitesuit.addTest(unittest.makeSuite(TestBaiduOne.Baidu1))suit.addTest(unittest.makeSuite(TestBaiduTwo.Baidu2))return suite
if __name__=="__main__":suite= createsuite()runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)

 

相关文章:

selenium(6)-----unittest框架

unittest框架 1)测试固件 1)setUp()是用来初始化测试环境所做的工作 2)tearDown()是用来清理环境所做的工作 2)测试套件 把不同的测试脚本,不同类中的测试用例给组织起来放到一个测试套中执行 3)测试用例的要以test_开头 4)如何使用unittest框架 只需要在脚本中定义…...

统计软件与数据分析--Lesson3

dataframe数据常用python操作dataframe数据常用知识点1.创建dataframe1.1使用字典创建DataFrame:1.2使用列表创建DataFrame:1.3使用numpy数组创建DataFrame:1.4从TXT文件中创建DataFrame:1.5从CSV文件中创建DataFrame:…...

竞赛无人机搭积木式编程——以2022年TI电赛送货无人机一等奖复现为例学习(7月B题)

在学习本教程前,请确保已经学习了前4讲中无人机相关坐标系知识、基础飞行控制函数、激光雷达SLAM定位条件下的室内定点控制、自动飞行支持函数、导航控制函数等入门阶段的先导教程。 同时用户在做二次开发自定义的飞行任务时,可以参照第5讲中2021年国赛植…...

oracle基础操作

oracle基础操作语法: 1、查询会话 SQL> select count(*) from v$session;2、增大连接数 SQL> alter system set processes5000 scope spfile;3、增大会话数 SQL> alter system set sessions7552 scopespfile;4、查询 参数: SQL> sho…...

python爬虫数据写入excel

在Jmeter118中描述了如何将接口请求的响应数据写入到csv中,同样的接口如果采用python写法,会简便很多,主要是用到了python中的pandas库#爬取展台数据import requestsimport pandas as pdurlhttps://ficonline.cfaa.cn/Exhibition/searchExhib…...

优思学院|六西格玛DMAIC,傻傻搞不清?

DMAIC还是搞不清? DMAIC是一个用于过程改进和六西格玛的问题解决方法论。它是以下五个步骤的缩写: 定义(Define):明确问题,设定项目的目标和目的。绘制流程图,并收集数据,以建立未来…...

【Linux】网络编程套接字(下)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

【Linux网络】网络编程套接字(上)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

十二、51单片机之DS1302

1、DS1302简介 (1)详情查看数据手册。 (2)管角描述 管教名称功能1Vcc2双供电配置中的主电源供电引脚2X1与标准的32.768kHz晶振相连。用于ds1302记时。3X24GND电源地5CE输入信号,CE信号在读写时必须保持高电平6I/O输入/推挽输出I/O,是三线接口的双向数…...

ChatGPT-4震撼发布

3月15日消息,美国当地时间周二,人工智能研究公司OpenAI发布了其下一代大型语言模型GPT-4,这是其支持ChatGPT和新必应等应用程序的最新AI大型语言模型。该公司表示,该模型在许多专业测试中的表现超出了“人类水平”。GPT-4, 相较于…...

HTML樱花飘落

樱花效果 FOR YOU GIRL 以梦为马&#xff0c;不负韶华 LOVE YOU FOREVER 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv"…...

力扣-排名靠前的旅行者

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1407. 排名靠前的旅行者二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...

马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?

最近这段时间 ChatGPT 掀起了一阵 AI 热潮&#xff0c;目前来看网上大部分内容都是在调戏 AI&#xff0c;很少有人写如何用 ChatGPT 做正事儿。 作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员&#xff0c;第一次和 ChatGPT 促膝长谈后&#xff0c;基本认定了一个事…...

怎么避免服务内存溢出?

在高并发、高吞吐的场景下&#xff0c;很多简单的事情&#xff0c;会变得非常复杂&#xff0c;而很多程序并没有在设计时针对高并发高吞吐量的情况做好内存管理。 自动内存管理机制的实现原理 做内存管理&#xff0c;主要考虑申请内存和内存回收两部分。 申请内存的步骤&…...

01_I.MX6U芯片简介

目录 I.MX6芯片简介 Corterx -A7架构简介 Cortex-A处理器运行模型 Cortex-A 寄存器组 IMX6U IO表示形式 I.MX6芯片简介 ARM Cortex-A7内核可达900 MHz,128 KB L2缓存。 并行24bit RGB LCD接口&#xff0c;可以支持1366*768分辨率。 3.8/10/16位 并行摄像头传感器接口(CS…...

嵌入式学习笔记——STM32的中断控制体系

STM32的中断控制体系前言STM32中断的概念中断类型中断控制常用控制函数区分中断源与中断信号配置中断优先级分组问题中断使能中断服务函数总结前言 上一篇中&#xff0c;借着串口接受的问题&#xff0c;简要说了一下串口中断的作用和用法&#xff0c;本文将对STM32的中断控制体…...

如何发布自己的npm包

一、什么是npm npm是随同nodejs一起安装的javascript包管理工具&#xff0c;能解决nodejs代码部署上的很多问题&#xff0c;常见的使用场景有以下几种&#xff1a; ①.允许用户从npm服务器下载别人编写的第三方包到本地使用。 ②.允许用户从npm服务器下载并安装别人编写的命令…...

Qt QProcess管道命令带“|”多命令执行获取stdout输出问题总结

问题描述: 在Qt中,使用system和QProcess执行命令,system执行的命令,我们通常不需要获取stdout的输出结果,所以只需要得到返回结果,知道成功失败即可。 而用到QProcess,多半是要获取输出的返回信息。 这里的返回信息只要是标准输出的即可,当然了,也可以是别的channe…...

【JavaEE进阶篇2】spring基于注解开发1

在上一篇文章当中&#xff0c;我们提到了怎样使用spring来创建一个bean对象。下面&#xff0c;我们继续来研究一下&#xff0c;更加优胜的开发方式&#xff1a;基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使…...

统一登录验证统一返回格式统一异常处理的实现

统一登录验证&统一返回格式&统一异常处理的实现 一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...