unittest + selenium 编写一个简单的自动化测试用例

it2023-02-12  89

测试用例 1

测试对象: B站 (B站登录) https://passport.bilibili.com/login只简单测试了登录功能,而且还没完善, 没完善的内容是, B站登录需要一个验证码, 我这点没有实现, 所以是选择手动点击图片验证码,下面还有一个GitHub的登录测试用例, GitHub登录时不需要验证码分析b站的登录网页的数据结构输入账号的文本框输入密码的文本框登录的点击按钮先创建一个测试用例文件 test_bilibili.py 文件,在里面编写测试用例 """ 测试用例 测试对象: B站 (B站登录) https://passport.bilibili.com/login """ import unittest import time from parameterized import parameterized from selenium import webdriver class TestLogin(unittest.TestCase): """ 1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器 2. 查找用户名输入框 3. 查找密码的输入框 4. 点击登录 5. 断言登录成功与否 使用登录后的页面上的用户名进行断言 """ def setUp(self) -> None: # 创建一个浏览器对象 self.driver = webdriver.Chrome("../chromedriver.exe") # 发送请求 self.driver.get("https://passport.bilibili.com/login") def tearDown(self) -> None: self.driver.close() # 关闭浏览器 self.driver.quit() # 退出浏览器 def test_login(self): # 创建账号登录信息 username = "这里输入你的账号" password = "这里输入你的密码" # 查找输入账号的文本框, 并输入账号 time.sleep(1) self.driver.find_element_by_id("login-username").clear() # 先清空文本框内容 self.driver.find_element_by_id("login-username").send_keys(username) # 输入账号 # 查找出入密码的文本框, 并输入密码 time.sleep(1) self.driver.find_element_by_id("login-passwd").clear() # 先清空文本框的内容 self.driver.find_element_by_id("login-passwd").send_keys(password) # 输入密码 # 查找登录的按钮, 点击登录 time.sleep(0.5) self.driver.find_element_by_class_name("btn-login").click() # 代码写到一半, 我发现登录需要一个图片验证码, 所以我决定图片验证码手动点一下, 这里延迟 10 秒进行手动点击 time.sleep(10) # 断言登录是否成功 handle = self.driver.current_window_handle self.driver.switch_to.window(handle) index = self.driver.find_element_by_xpath('//*[@id="primaryPageTab"]/ul/li[1]/a/span').text self.assertEqual(index, "首页", msg='登录失败') 然后编写执行文件text_run.py 文件, 用来执行测试用例 import unittest from BeautifulReport import BeautifulReport """ 使用run文件执行unittest 文件时, 可以直接导入 这时 unittest 会自动查找导入问价中类去执行 但是文件的开头以test 文件的类和函数也必须以test开头 """ if __name__ == '__main__': """ defaultTestLoader 使用unittest.defaultTestLoader()类, 这个类的作用就是,调用这个类的discover()方法, 搜索指定目录下指定开头的.py文件, 并将搜索到的测试用例组装成一个测试集合, 听上去是不是和 TestSuite 的作用差不多 """ # 先确定一个要搜索的路径 test_dir = "." # 然后创建集合对象 dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_bilibili.py') runner = BeautifulReport(dis) runner.report( description="b站登录", filename="bilibili_login" # 生成测试报告的文件名 )

这个只能输入一个账号, 看上去很不方便,我在介绍一个很好用的模块, 这个模块就像是一个装饰器 先安装

pip install parameterized

然后把测试用例test_bilibili.py改为如下

""" 测试用例 测试对象: B站 (B站登录) https://passport.bilibili.com/login """ import unittest import time from parameterized import parameterized from selenium import webdriver class TestLogin(unittest.TestCase): """ 1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器 2. 查找用户名输入框 3. 查找密码的输入框 4. 点击登录 5. 断言登录成功与否 使用登录后的页面上的用户名进行断言 """ # 创建登录数据, 这里可以写多个账号进行测试 data = [ ('账号', '密码'), ('账号', '密码'), ('账号', '密码'), ] def setUp(self) -> None: # 创建一个浏览器对象 self.driver = webdriver.Chrome("../chromedriver.exe") # 发送请求 self.driver.get("https://passport.bilibili.com/login") def tearDown(self) -> None: self.driver.close() # 关闭浏览器 self.driver.quit() # 退出浏览器 @parameterized.expand(data) def test_login(self, username, password): # 查找输入账号的文本框, 并输入账号 time.sleep(1) self.driver.find_element_by_id("login-username").clear() # 先清空文本框内容 self.driver.find_element_by_id("login-username").send_keys(username) # 输入账号 # 查找出入密码的文本框, 并输入密码 time.sleep(1) self.driver.find_element_by_id("login-passwd").clear() # 先清空文本框的内容 self.driver.find_element_by_id("login-passwd").send_keys(password) # 输入密码 # 查找登录的按钮, 点击登录 time.sleep(0.5) self.driver.find_element_by_class_name("btn-login").click() # 代码写到一半, 我发现登录需要一个图片验证码, 所以我决定图片验证码手动点一下 time.sleep(10) # 断言登录是否成功 handle = self.driver.current_window_handle self.driver.switch_to.window(handle) index = self.driver.find_element_by_xpath('//*[@id="primaryPageTab"]/ul/li[1]/a/span').text # # 进行断言, 如果在登录后的界面出现"首页"二字,就代表成功.否则视为失败 self.assertEqual(index, "首页", msg='登录失败') 整个测试的流程已经写完了, 有很大的瑕疵, 就在没有完成自动点击图片验证, 直接看下一个吧

测试用例 2

测试对象: GitHub (登录) https://github.com/login先分析网页结构,查找登录时账号的文本输入框在定位密码的输入文本框在 定位登录按钮登录成功后进行断言, 如果在登录后的界面出现你的用户名,就代表成功.否则视为失败 创建测试用例文件 test_git.py """ 测试用例 测试对象: github https://github.com/login """ import unittest import time from parameterized import parameterized from selenium import webdriver class TestLogin(unittest.TestCase): """ 1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器 2. 查找用户名输入框 3. 查找密码的输入框 4. 点击登录 5. 断言登录成功与否 使用登录后的页面上的用户名进行断言 """ # 创建登录数据 data = [ ("账号", "密码"), ('sssssss-dss', 'nisshui1'), ] def setUp(self) -> None: # 创建一个浏览器对象 self.driver = webdriver.Chrome("../chromedriver.exe") # 发送请求 self.driver.get("https://github.com/login") def tearDown(self) -> None: self.driver.close() # 关闭浏览器 self.driver.quit() # 退出浏览器 @parameterized.expand(data) def test_login(self, username, password): time.sleep(1) self.driver.find_element_by_id("login_field").clear() # 先清空文本框内容 self.driver.find_element_by_id("login_field").send_keys(username) # 输入账号 # 查找出入密码的文本框, 并输入密码 time.sleep(1) self.driver.find_element_by_id("password").clear() # 先清空文本框的内容 self.driver.find_element_by_id("password").send_keys(password) # 输入密码 # 查找登录的按钮, 点击登录 time.sleep(0.5) self.driver.find_element_by_class_name("btn-primary").click() time.sleep(1) # 断言登录是否成功 handle = self.driver.current_window_handle self.driver.switch_to.window(handle) index = self.driver.find_element_by_xpath("//span[@class='flex-shrink-0 css-truncate css-truncate-target']").text # 进行断言, 如果在登录后的界面出现你的用户名,就代表成功.否则视为失败 self.assertEqual(index, username, msg='登录失败')

编写执行文件 test_git_run.py

import unittest from BeautifulReport import BeautifulReport """ 使用run文件执行unittest 文件时, 可以直接导入 这时 unittest 会自动查找导入问价中类去执行 但是文件的开头以test 文件的类和函数也必须以test开头 """ if __name__ == '__main__': """ defaultTestLoader 使用unittest.defaultTestLoader()类, 这个类的作用就是,调用这个类的discover()方法, 搜索指定目录下指定开头的.py文件, 并将搜索到的测试用例组装成一个测试集合, 听上去是不是和 TestSuite 的作用差不多 """ # 先确定一个要搜索的路径 test_dir = "." # 然后创建集合对象 dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_git.py') runner = BeautifulReport(dis) runner.report( description="Github 登录", filename="Github_login" # 生成测试报告的文件名 )

我只使用了两个账号信息, 一对一错, 测试报告如下

最新回复(0)