ui自动化( 四 )

测试金字塔模型:

 

 

白盒测试原理

在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件 细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统, 它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代 码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为 白盒测试。

 

在自动化测试过程中,编写的每一个测试用例都是需要借助单元测试框架的,那么在Python技术栈中,单元测试框架主要是unittest和Pytest,Java技术栈里面主要使用的是junit和testng

 

 

设置:做一件事的前置动作,也就是初始化
执行:测试步骤(具体干一件事的操作步骤)
验证:断言,验证做一件事的结果是否正确
清理:后置动作

 

unittest是单元测试框架,使用它的注意事项:

1、测试类建议以Test开头

2、每个测试类必须要继承unittest模块中的TestCase类,这样就可以直接调用里面的方法

3、在测试类里面编写的方法叫测试方法,测试方法必须是以test开头的

所有的测试用例都必须在test包下,每个测试模块都应该是以test_模块名称来命名
每个测试类都建议Test开头,每个测试方法必须是以test开头

 

 

测试用例:就是测试类里面编写的测试方法 测试固件:初始化和清理,使用到的方法分别是setUp()和tearDown()

测试套件:就是测试用例的集合,在一个测试套件可以有很多的测试用例,它的英文单词是TestSuite

测试执行:TestRunner,执行测试套件或者测试用例

测试报告:TestReport,就是执行所有测试用例后的结果信息

import unittest
from selenium.webdriver.common.by import By
import time as t
from selenium.webdriver.common.action_chains import ActionChains
from test.init import Init

  使用继承的思想,把测试固件分离,这样的好处是只需要在一个地方维护测试固件,而不是多个地方维护。
其他的测试类只只需要继承测试固件就可以使用了

以百度为例
class TestBaidu(Init):
def test_baidu_title(self):
'''百度 title的验证'''
self.assertEqual(self.driver.title,'百度一下,你就知道')
# assert self.driver.title=='百度一下,你就知道'

def test_baidu_url(self):
'''百度 url的验证'''
self.assertEqual(self.driver.current_url,'https://www.baidu.com/')
# assert self.driver.current_url=='https://www.baidu.com/'

def test_baidu_so(self):
'''验证是否输入 接口测试 '''
so=self.driver.find_element(By.ID,'kw')
so.send_keys('接口测试')
self.assertEqual(so.get_attribute('value'),'接口测试')
# assert so.get_attribute('value')=='接口测试'
def test_baidu_click(self):
'''验证点击 关于百度'''
we=self.driver.find_element(By.LINK_TEXT,'关于百度')
self.assertTrue(we.is_displayed())

def test_baidu_setting(self):
'''验证 抖索设置'''
t.sleep(3)
setting=self.driver.find_element(By.XPATH,'//*[@id="s-usersetting-top"]')
action=ActionChains(driver=self.driver)
action.move_to_element(setting).perform()
t.sleep(3)
self.driver.find_element(By.XPATH,'//*[@id="s-user-setting-menu"]/div/a[1]/span').click()
t.sleep(3)
sosetting=self.driver.find_element(By.XPATH,'//*[@id="wrapper"]/div[6]/div/div/ul/li[1]')
self.assertEqual(sosetting.text,'搜索设置')

if __name__ == '__main__':
unittest.main()

assertEqual():比较的是两个对象的==关系

assertIn():比较的是两个对象的包含关系

assertIs():比较两个字符串的内存地址

assertTrue()

assertFalse()

测试固件:

                   1、setUp() and tearDown():在一个测试类里面,有多少个测试用例,它就会被执行多少次

                   2、setUpClass() and tearDownClass():是类方法,不管测试类里面有多少测试用例,它只会执行一次

 

 新浪例子

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time as t

class Testsina(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(20)

def tearDown(self) -> None:
self.driver.quit()

def test_ussername_null(self):
'''验证账户密码为空'''
self.driver.find_element(By.LINK_TEXT,'登录').click()
t.sleep(3)
divText=self.driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'请输入邮箱名')

def test_email_format(self):
'''验证格式不正确'''
self.driver.find_element(By.ID,'freename').send_keys('fwfds')
self.driver.find_element(By.ID,'freepassword').send_keys('cwcw')
self.driver.find_element(By.LINK_TEXT,'登录').click()
t.sleep(3)
divText=self.driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'您输入的邮箱名格式不正确')

def test_password_error(self):
'''验证 登录名或密码错误'''
self.driver.find_element(By.ID,'freename').send_keys('c@sina.com')
self.driver.find_element(By.ID, 'freepassword').send_keys('cwcw')
self.driver.find_element(By.LINK_TEXT, '登录').click()
t.sleep(3)
divText=self.driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text, '登录名或密码错误')

if __name__ == '__main__':
unittest.main()

参数化:
当一个测试场景,它的测试步骤相同,测试数据不一样的时候,那么就可以使用参数化的思想来解决
在unittest测试框架中,参数化需要借助第三方的库 parameterized
安装第三方库 pip install parameterized
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time as t
from parameterized import parameterized,param

class Testsina(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(20)

def tearDown(self) -> None:
self.driver.quit()

@parameterized.expand([
param('','','请输入邮箱名'),
param('fwfds','cwcw','您输入的邮箱名格式不正确'),
param('c@sina.com','cwcw','登录名或密码错误')
])

def test_password_error(self,ussername,password,result):
'''登录错误信息验证'''
self.driver.find_element(By.ID,'freename').send_keys(ussername)
self.driver.find_element(By.ID, 'freepassword').send_keys(password)
self.driver.find_element(By.LINK_TEXT, '登录').click()
t.sleep(3)
divText=self.driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text, result)

if __name__ == '__main__':
unittest.main()

生成测试报告:
unittest生成测试报告需要借助第三方的库HtmlTestRunner.py的文件
放在python下面的Lib目录下
在test目录下新建report的文件
import unittest
import os
import HTMLTestRunner
def allTests():
'''获取要执行的测试模块'''
suita=unittest.TestLoader().discover(
#start_str 指的是测试模块的路径
start_dir=os.path.dirname(__file__),
#pattern 通过正测方式加载所有的测试模块
pattern='test_*.py')
return suita

def run():
filename=os.path.join(os.path.dirname(__file__),'report','index.html')
fp=open(filename,'wb')
runnner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='ui自动化测试',
description='ui test'
)
runnner.run(allTests())

if __name__ == '__main__':
run()

 


 

 
 
 

 

posted @   刘乐乐liu  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示