第一种讲解线性脚本流程
第二种讲解unnttest 框架
第三种讲解po分层模式
======================================
第一种方法:
案例1:
我之前在公司做ui自动化使用的是python+selenium库,浏览器使用的是chrome(/krəʊm/)。就拿百年人寿保险项目来说,我讲下用户注册,登录,投保的一个流程讲下。
首先导入模块selenium模块,tinme模块,from selenium import webdriver语句和from time import sleep语句导入webdriver函数和sleep函数。
然后创建一个driver对象调用webdriver,语句drive=webdriver.chrome(),在通过driver.get(网站)打开项目的首页,再使用driver.maximize(/ˈmæksɪmaɪz/)_window()最大化浏览器窗口,防止窗口过小页面元素加载不完全或者点击不到.然后会使用driver.implicitly(/ɪmˈplɪsɪtli/)_wait(10)设置一个隐形等待,因为程序的运行速度比网速快,要给网页一些反应时间
进入网页后点击注册,注册时一个a标签,通过link_text去定位取点击,用click点击。跳转注册页面显示信息,需要填写注册信息,通过id定位用户名输入框和密码输入框,使用send_keys传入用户名和密码的参数值,通过xpath定位手机号输入框,使用send_keys传入手机号码,最后通过link_text去定位网页的“注册用户”这个链接元素,使用click点击。到这就注册完成了,会自动跳转到项目首页。
项目首页有保险商城可以选择保险产品进行投保,首先通过link_text定位首页的“保险商城”这个链接元素,使用click点击,这时候页面跳转进入保险商城挑选保险产品,就拿综合意外险来说,使用class定位“综合意外险”这个链接元素,使用click点击后会进入具体的保险产品页面,在这个页面选择一款保险产品之后,使link_text定位“立即购买”这个链接元素,使用click进行点击后会跳转到填写投保信息这一块,主要有投保人、被保人的姓名、性别、身份证号码、手机号码、居住地址等,这些元素都是通过id、name、class、xpath、link_text等方法进行定位,然后通过send_keys传入相关的身份信息,其中的居住地址的省份和城市是个下拉框,需要先导入Select模块,然后使用id去定位这个下拉框赋值给一个变量,再用Select接这个变量,我使用的是使用select by index的方法,选择1个对应的索引值。投保信息填好之后再使用id定位“保存投保信息”,使用click点击,然后就会显示“投保信息保存成功”,然后我会根据“投保信息保存成功”这个文本进行断言,用的是if判断语句,最后使用quit(/kwɪt/)关闭浏览器。
前台操作完成后,再进入数据库进行校验,首先导入pymysql模块,使用connect连接项目的数据库并创建一个连接数据库对象,用cursor(/ˈkɜːsə®/)获取游标,游标的作用的是可以执行sql语句,并把execute(/ˈeksɪkjuːt/)执行的结果保存到游标对象中,使用fetchall()的方法查询表中的所有数据,查看这个数据是否和我们在前台输入的信息一致,然后就断开数据库链接,关闭浏览器。这就是我的大概流程了。
案例2:
Ui自动化测试
那我说一下之前做的自动化项目,它是一个叫出行无忧的保险项目,主要是通过python+seleium的方式编写,selenium是一个第三方库,先在dos窗口安装完成后,在python中从selenium导入webdriver这个模块,(用from selenium import webdriver语句)再导入time库中的sleep模块(from time import sleep)因为网络追不上程序的运行速度,需要给时间等待,我们自动化用的是chrome浏览器,那就用webdriver.chrome () 调用驱动并给它创建一个对象d对浏览器实现操作,也就是给他赋予一个变量,然后通过get方式输入url来打开网站,再使用d.maxmize_window给它窗口最大化,这个是为了不让遮挡页面元素,然后设置个强制时间等待sleep(2s)。接下来就是按照我的页面提示框进行元素定位,这里还需要导入一个鼠标悬停模块(from selenium.webdriver.common.action_chains import ActionChains)将鼠标移动到个人保险业务下滑,利用元素定位(9种)到保险商城,移动鼠标并点击,判断是否正常跳转到新页面,可打印title获取当前页面进行查看,在接着操作,元素定位按照健康险,意外险顺序进行点击,点击进去没有登入账号的情况下需要先登录,如果没有账户,定位到新户注册按钮跳转到注册页面,继续进行定位input输入send keys相应数据完成注册,然后将新注册的账号填入登录页面,用xpath定位确认登录按钮用click点击,登录就完成了跳转到投保页面,用window_scrool向下滑,弹出一个iframe框提示我阅读投保说明书,我需要进入到iframe框(switch_to.frame())进行定位点击已阅读,再退出iframe框(switch_to.default_content()),继续向下滑动有一个个人版和家庭版套餐,还有两个投保金额,可以定位到选择框进行点击,之后定位input输入框填写信息,最后定位点击立即支付,会调用接口自动扣款,等待几秒后出现一个新页面显示支付成功,以上就是我的ui自动化的整个投保流程。
===========================================================
unittest 框架 和pytest 框架
import unittest
from selenium import webdriver
from time import sleep #时间戳,导入time模块
from ui.HTMLTestRunner3_New import HTMLTestRunner #导入HTMLTestRunner类==》用来生成测试报告的
import time
class Test_Baidu(unittest.TestCase):
def setUp(self): #方法开始
self.driver = webdriver.Chrome()
self.driver.get(‘http://www.baidu.com’)
self.driver.implicitly_wait(20)
def test001(self): #一条用例
self.driver.find_element_by_id(‘kw’).send_keys(‘duoceshi’)
self.driver.find_element_by_id(‘su’).click()
def test002(self): #一条用例
self.driver.find_element_by_id(‘kw’).send_keys(‘selenium’)
self.driver.find_element_by_id(‘su’).click()
title = self.driver.title
self.assertEqual(title,‘百度一下,你就知道’)
self.assertIn(title,‘百度一下,你就知道’)
self.assertNotEqual(title,‘百度一下,你就知道123’)
def tearDown(self): # 方法结束 注意和位置没有关系的
sleep(3)
self.driver.close()
#定义一个普通函数
def all_case(): #一个套件中的测试用例
suite = unittest.TestSuite() #创建一个套件、或者说一个容器、作用就是用来装所有的用例suite是一个对象# suite.addTest(Test_Baidu(‘test001’)) #把用例添加到套件里面
#suite.addTest(Test_Baidu(‘test002’))
#suite.addTests([Test_Baidu(‘test001’),Test_Baidu(‘test002’)]) #放一个列表进去,对列表中的列表遍历
return suite #把装满了用例的suite套件返回给到函数的调用处
if name == ‘main’:
#第一种运行方法:运行所有的用例
unittest.main()
#第二种运行方法:可以选择运行用例
runner = unittest.TextTestRunner()
runner.run(all_case())
#第三种运行方法:自动搜索用例
在规定的目录下去搜索以less开头和.py结尾的模块中的用例
start_dir = r’C:\Users\Administrator\PycharmProjects\untitled\ui’
discover1 = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern=‘lesson2*.py’) #通配符
print (discover)
runner = unittest.TextTestRunner()
runner.run(discover)
#第四种运行方法:自动化搜索+生成测试报告
start_dir = r’C:\Users\Administrator\PycharmProjects\untitled\ui’
discover = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern='less.py’) #中间* 是通配符
#1.定义生成的测试报告的名称
path = r’C:\Users\Administrator\PycharmProjects\untitled\ui’
##报告生成在我们当前路径,copy本地路径
now = time.strftime(’%Y-%m-%d-%H-%M-%S’)
filename = path + “\” +str(now) + ‘_ui.html’ ##ui.html’表示
f = open(filename,‘bw’) #以二进制的方式在…ui.html文件中写入报告模板和测试结果
##w 是写,b 是表示二进制方式写入,
runner = HTMLTestRunner(stream=f, title=‘百度ui自动化测试报告’,description=‘用例执行情况如下:’,)
runner.run(discover)
f.close() #释放资源、关闭文件
runner = HTMLTestRunner(stream=f, title=‘百度用例’, description=‘用例详细如下’)
runner.run(discover) # 通过run来执行当前dis_cover匹配里面的文件
TstCase:
一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown
TestSuite:
对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中
TextTestRunner:
是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中
TestFixture:
测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。
TestLoader:
是用来搜索所有以test开头的测试用例,然后将其加入到testsuite中
========================================================
po框架:
自动化测试框架概念:
自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。
作用:用于解决或处理复杂的问题。
对于测试人员来说:
线性脚本的自动化脚本在维护性和可用性上较差,所以利用设计框架来实现自动化测试
框架设计的目标:
设计出来的框架是直接给测试人员或其他测试人员简单向里面不断补充用例,所以我们的框架设计必须
三简化:操作简单、维护简单、拓展简单
设计框架的同时要结合业务流程,不仅靠技术实现,还要对业务流程的理解和把握(重点和难点)
设计框架时要将基础的feng封装成公用的如:断言,定位方法,等
设计用例要与代码分开,便于用例管理,可以采用数据驱动框架实现。比如(ddt数据驱动)
====================================================
po框架
(1)po(page object 缩写)
(2)业务流程与页面元素操作分离 ,可以简单理解为每个页面下都有一个配置class,配置类就是用来维护页面元素或操作方法
(3)提高测试用例的可维护性、可读性
先创建一个保险项目
(1)在创建一个包==存放所有配置文件信息(比如项目路径和数据,用例的路径) 定义:cofing包
可以封装路径
(2)在创建一个存放放数据(测试数据)定义为:Data包
在Data包中创建一个TestData目录(放测试数据)
测试环境的一些url地址和账号密码可以放在TestDta中
(3)在创建一个存放测试报告包 定义为: report包
在report包中创建一个Testrepot目录(存放报告)
(4)在创建一个公开的包(存放一些功能用例) public包
在public包中创建pages存放元素层流程层(封装所有页面的公共方法,基类)
在public包中创建utils包(处理公共类公共函数都存放在此)
可以在utils中来读取pages中封装的登录的流程(封装读取ini文件或者EXCEL表格的工具类和工具函数
(5)在创建一个用例包用来存放用例 定义为:TestCase包
编写测试用例
(6)在创建一个包用来运行 定义为:run包
通过运行测试用例中封装好的用例在运行然后在repot中生成测试报告