day21——web自动化测试(3)Unittest+Selenium实战小案例

【没有所谓的运气🍬,只有绝对的努力✊】

目录

今日目标:

1、UnitTest框架

2、UnitTest 核心用例

2.1 TestCase 

2.2 TestSuite

2.3 TestRunner 

2.4 TestLoader

2.5 TestLoader 与 TestSuite的区别

2.6 Fixture 

3、断言

3.1 12306自动化登录——断言案例

3.2 断言扩展

4、参数化

 5、小结

6、unitTest 跳过方法

7、生成测试报告

8、with open 和 open的区别


今日目标:

1、UnitTest框架

2、UnitTest 核心用例

2.1 TestCase 

import unittestdef addFn(x,y):return x + yclass Test01(unittest.TestCase):# 用例 必须以 test_ 开头def test_method01(self):self.assertEqual(addFn(1,2),3)if __name__ == '__main__':unittest.main(verbosity=2)

2.2 TestSuite

import unittest
from unitTest.test_01_testcase import Test01# 定义测试套件
suite = unittest.TestSuite()
# 方法1:      往测试套件里面添加内容
# suite.addTest(Test01('test_method02'))# 方法2:  使用makeSuite 下面的所有以test_开头的测试用例。
suite.addTest(unittest.makeSuite(Test01))# 执行测试套件
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

2.3 TestRunner 


2.4 TestLoader

import unittestsuite = unittest.defaultTestLoader.discover('./case')  # 默认是以  test*.py 的文件runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)


2.5 TestLoader 与 TestSuite的区别

2.6 Fixture 

import unittestdef setUpModule():print('模块级别----开始')def tearDownModule():print('模块级别----结束')class TestCase(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print("类级别========开始")@classmethoddef tearDownClass(cls) -> None:print("类级别========结束")def setUp(self) -> None:print('------方法级别---开始------')def tearDown(self) -> None:print('-----方法级别--- 结束-')def test_method01(self):print('方法01')def test_method02(self):print('方法02')if __name__ == '__main__':unittest.main(verbosity=2)

3、断言

3.1 12306自动化登录——断言案例

需求:使用unitTest 框架对 12306 网页登录页面进行测试。

(1)进入页面 https://www.12306.cn/index/,点击右上角的 “登录”,进入登录页面。

(2)输入用户名,不输入密码,点击”立即登录“按钮。

(3)获取错误提示信息

(4)断言错误提示信息是否为”请输入密码!“,如果断言失败,则保存截图。

import unittestfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byfrom time import sleepclass TestLogin12306(unittest.TestCase):def setUp(self) -> None:# 设置正确的驱动路径service = ChromeService(executable_path="/usr/local/bin/chromedriver")options = webdriver.ChromeOptions()driver = webdriver.Chrome(service=service, options=options)self.driver = driver# 1、进入12306网站首页driver.get('https://www.12306.cn/index/')sleep(2)# 最大化浏览器driver.maximize_window()# 隐式等待driver.implicitly_wait(30)# 2、点击右上角的登录按钮current_handle = driver.current_window_handle   # 获取当前页面窗口driver.find_element(By.ID, "J-btn-login").click()sleep(2)# 3、进入登录页面 新窗口# 获取所有打开页面窗口handles = driver.window_handlesfor h in handles:if h != current_handle:driver.switch_to.window(h)  # 切换窗口# 刷新页面driver.refresh()sleep(2)def tearDown(self) -> None:sleep(2)self.driver.quit()def test_login_usernam_not_password(self):driver = self.driver# 4、输入用户名 adminself.driver.find_element(By.ID, 'J-userName').send_keys("admin")sleep(2)# 5、点击 "立即登录"按钮driver.find_element(By.ID, 'J-login').click()sleep(2)# 6、获取错误提示信息error_msg = driver.find_element(By.CSS_SELECTOR, '#J-login-error span').textsleep(2)expect_result = "请输入密码!"try:self.assertEqual(error_msg, expect_result)except AssertionError:# 截图driver.save_screenshot("./image/error_.png")# if __name__ == '__main__':
#     unittest.main(verbosity=2)

(自动化运行结果)

(自动化运行过程中,断言出错,自动保存的图片)


3.2 断言扩展

4、参数化

import unittestfrom parameterized import parameterizeddef get_data():return [(1, 2, 3), (3, 0, 3)]class TestCase(unittest.TestCase):# 方法1:# @parameterized.expand([(1, 2, 3), (3, 0, 3)])# def test_add(self, a, b, result):#     self.assertEqual(a + b, result)# 方法2:# data = [(1, 2, 3), (3, 0, 3)]# @parameterized.expand(data)# def test_add(self, a, b, result):#     self.assertEqual(a + b, result)# 方法3:  get_data() 在 Class的外面。@parameterized.expand(get_data())def test_add(self, a, b, result):self.assertEqual(a + b, result)

 5、小结


6、unitTest 跳过方法

import unittestversion = 30
class TestCase(unittest.TestCase):@unittest.skipdef test_method01(self):# 功能未完成print("test01")passdef test_method02(self):print("test01")@unittest.skipIf(version >= 30,"版本大于30的,就跳过")def test_method02(self):print("test01")

7、生成测试报告

import time
import unittest
from test_08_skip import TestCase
from tools.HTMLTestRunner import HTMLTestRunner# suite = unittest.TestSuite()
# suite.addTest(TestCase('test_method02'))
suite = unittest.defaultTestLoader.discover('./', pattern="test_01*.py")# 自带写入  .txt文件
# with open("./report/reporter.txt",'w',encoding='utf-8') as f:
#     unittest.TextTestRunner(verbosity=2,stream=f, descriptions=True).run(suite)# 使用tools/HTMLTestRunner 写入.html文件
file_name = "./report/reporter{}.html".format(time.strftime("%y_%m_%d %H_%M_%S"))
with open(file_name, "wb") as f:   # 生成html报告,必须使用  wbHTMLTestRunner(stream=f, verbosity=2, title="xxx项目自动化测试报告").run(suite)

(测试用例的报告结果展示)


8、with open 和 open的区别


今天写了个小的案例,Selenium + UnitTest 。完成12306的登录页面的 断言测试,还是很满足的。晚上继续学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Flink运行时架构】系统构架

SMP架构 数据处理系统的架构最简单的实现方式就是单节点,但是随着数据量的增大,为了使单节点的机器性能更加强大,需要增加CPU数量和加大内存来提高吞吐量。这就是所谓的SMP(Symmetrical Multi Processing,对称多处理)架构。 但是这种架构带来…

CountDownLatch应用举例

定义 CountDownLatch是juc下的一个多线程锁,下面是jdk对它的定义 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 翻译如下 一种同步辅助工具,允许一个或多个…

ADC(二):外部触发

有关ADC的基础知识请参考标准库入门教程 ADC(二):外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…

磁盘分区格式

MBR和GPT ‌磁盘分区形式主要有两种:MBR和GPT。‌‌ MBR(Master Boot Record) MBR是一种较旧的分区形式,首次引入于1983年的IBM PC DOS 2.0。它位于驱动器的第一个扇区,包含460字节的引导代码、64字节的磁盘分区表和…

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO:中药配伍的复杂性1.QUBO 的介入:寻找最佳药材组合 二、难题:QUBO矩阵未知的问题1.为什么这么难? 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择: 三、压缩感知算法(C…

【连续学习之SSL算法】2018年论文Selfless sequential learning

1 介绍 年份:2018 期刊: arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一种名为SLNID(Sparse coding through Local Neural Inhibition and…

关于SNAT、DNAT及浮动地址

SNAT、DNAT SNAT、DNAT就是实现代理的功能。 SNAT 类似于客户端代理:内网主机通过共享公网 IP 地址访问外部服务。DNAT 类似于服务端代理:外部请求通过公网 IP 转发到内网主机上的服务。 没有大网地址的内部主机想要作为客户端访问外部网络(主…

结构方程模型【SEM】:嵌套分层数据及数据分组分析

结构方程模型(System of Equations Model,简称SEM),在生态学和环境科学中通常指的是一组描述生态系统中能量、物质和信息流动的数学方程。这些方程可以是确定性的,也可以是随机的,它们共同构成了一个模型&a…

hot100_56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。 请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。数据结构 二维链表存储每个区间 方法 先对每个区间的…

Python大数据:基于Python的王者荣耀战队数据分析系统的设计与实现

系统展示 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与MYSQL技术搭建了一个王者荣耀战队的数据分析系统。对用户提出的功能进行合理分析,然后搭建开发平台以及配置计算机软硬件;通过对数据流图以及系统结构的设计,创建相应的数据…

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的,在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号,到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

深入理解与优化Java二维数组:从定义到性能提升的全面指南

1. 定义和初始化二维数组 在Java中,二维数组可以看作是数组的数组。你可以将它想象成一个矩阵或表格,每个元素是一个数组。 1.1 定义二维数组 二维数组的定义语法如下: datatype[][] arrayName;datatype 是数组元素的数据类型。arrayName…

day26 文件io

函数接口 1 .open和close 文件描述符:系统为用open打开的文件分配的标识符 非负的整形数据 0-1023 最小未被使用原则 使用完时及时释放,避免文件描述符溢出 文件描述溢出就是文件使用完没有及时关闭文件 int open(const char *pathname, int flags); /…

Java Stream流详解——串行版

Stream流——串行版 ​ Stream流是java8引入的特性&#xff0c;极大的方便了我们对于程序内数据的操作&#xff0c;提高了性能。通过函数式编程解决复杂问题。 1.BaseStream<T,S extense BaseStream<T,S>> ​ 他是流处理的基石概念&#xff0c;重点不在于这个接…

el-backtop(返回顶部)

案例&#xff1a; <el-backtop target".app-main"><svg-icon icon-class"backtop" size"24px" /></el-backtop>

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

Vue3入门(9)

1. 【 replace属性】 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式。 浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff1a; - push是追加历史记录&#xff08;默认值&#xff09;。 - replace是替换当前记录。 . 开启replace模式&#xff…

第十九章 C++ 日期 时间

C 日期 & 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构&#xff0c;需要在 C 程序中引用 <ctime> 头文件。 有四个与时间相关的类型&#xff1a;clock_t、time_t、size_t 和 tm。类型…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天&#xff0c;电子配件行业作为科技创新的前沿阵地&#xff0c;正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备&#xff0c;各种新型电子配件层出不穷&#xff0c;极大地丰富了人们的生活。然而&#xff0c;随着产品种类的增多和功能的复杂化…