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

news/2024/12/29 1:48:30/

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

目录

今日目标:

UnitTest%E6%A1%86%E6%9E%B6-toc" style="margin-left:0px;">1、UnitTest框架

UnitTest%20%E6%A0%B8%E5%BF%83%E7%94%A8%E4%BE%8B-toc" style="margin-left:0px;">2、UnitTest 核心用例

TestCase%C2%A0-toc" style="margin-left:40px;">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的区别


今日目标:

UnitTest%E6%A1%86%E6%9E%B6">1、UnitTest框架

UnitTest%20%E6%A0%B8%E5%BF%83%E7%94%A8%E4%BE%8B">2、UnitTest 核心用例

TestCase%C2%A0">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.ppmy.cn/news/1558942.html

相关文章

第三节、电机定速转动【51单片机-L298N-步进电机教程】

摘要:本节介绍用定时器定时的方式,精准控制脉冲时间,从而控制步进电机速度 一、计算过程 电机每一步的角速度等于走这一步所花费的时间,走一步角度等于步距角,走一步的时间理解为一步距时间 w s t e p t … … ① w…

【Java 代码审计入门-02】SQL 漏洞原理与实际案例介绍

SQL注入漏洞全解析 发布日期:2024年12月26日 引言 在互联网的快速发展的今天,Web应用的安全性变得越来越重要。SQL注入(SQL Injection, 简称SQLi)作为最常见的Web安全漏洞之一,给无数网站和应用程序带来了巨大的风险…

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化 前言 ArrayBuffer ArrayBuffer内部包含一块Native内存,该ArrayBuffer的JS对象壳被分配在虚拟机本地堆(LocalHeap)。与普通对象一样,需要经过序列化与反序列化拷贝传递&#x…

【Python】基于界面库PyQt5+Qt Dsigner的环境配置和界面绘制

目录 一 安装PyQt5以及PyQt5-tools 二 配置外部开发工具 三 使用Qt Designer设计界面 四 使用PyUIC将ui文件转换为py文件 五 CU分离实现逻辑代码 一 安装PyQt5以及PyQt5-tools 之前做的一些Python脚本、软件都是基于 Tkinter 实现的,其中界面的设计布局是很头疼…

Docker Run使用方法及参数详细说明

Docker Run使用方法及参数详细说明 基本语法常用参数使用示例总结Docker Run是Docker中最基本的命令之一,用于创建并启动一个新的容器。通过Docker Run,用户可以基于指定的镜像创建一个容器实例,并且可以配置容器的各种参数,如网络设置、存储选项等。下面将详细介绍Docker …

自動提取API爬蟲代理怎麼實現?

爬蟲代理,簡單來說,就是在爬蟲和目標網站之間扮演“中轉站”角色的伺服器。它的主要功能是隱藏爬蟲的真實IP地址,從而避免被目標網站封禁。通過使用代理IP,爬蟲可以模擬多個用戶訪問,突破IP訪問限制,提高數…

出海隐私合规解决方案,一文助力中企合规出海

近两年越来越多的企业选择走出国门,拓展国际市场。尤其是在移动应用、游戏和电商等领域,出海已经成为企业发展的重要战略。 企业在出海过程中,需要特别关注这几点: 隐私合规是什么? 隐私合规对出海企业有哪些影响&a…

React-更新state的数据,dom没有重新渲染

{entourageList.map((person) > (<Row key{person.id}> {/* 使用唯一的 person.id */}<Col span{16}><Row gutter{16}><Col lg{9} md{18} sm{24}><FormItem label{姓名}>{getFieldDecorator(name-${person.id}, {initialValue: person.name,…