目录
14、unittest测试框架(22)
15、csv文件读取(23)
1.读取步骤
2.案例
16、数据驱动(24)
1.数据驱动步骤
2.代码编写思路
3.案例
17、数据断言(25)
案例之外
18、discover方法(26)
1.主要用途
2.使用格式
19、测试报告(27)
20.PO(28)
记录=========================================
数据驱动:(自动都运行一遍.牛啊。释放双手)
Discover方法
PO模式
1.导包
import unittest # 导入测试框架
2.框架使用说明
定义一个继承自等的测试用例类。
1.定义**setUp()**方法、**tearDown()**方法、**setUpClass()**方法、**tearDownClass()方法,其中setUp()**方法指在每个测试用例方法执行前,都会执行一次;**tearDown()**方法指在每次测试用例方法执行结束,都会执行一次;**setUpClass()**方法指在一个测试用例集执行前只执行一次;**tearDownClass()**方法指在一个测试用例集执行后只执行一次。
2.定义测试用例,名字以test开头。
3.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要调用assertEqual、assertRaises断言方法判断程序执行结果和预期值是否相符。
4.调用**unittest.main()**启动测试
import unittest from selenium import webdriver import time 案例步骤: 1、分别定义4个方法setUp()、tearDown()、test_denglu()、test_denglu1(); 2、setUp()方法启动浏览器; 3、tearDown()方法关闭浏览器; 4、test_denglu()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮; 5、test_denglu1()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮,在资产管理系统页面点击个人信息按钮。 ''' # 定义一个继承自unittest.TestCase的测试用例类。 class Denglu(unittest.TestCase): def setUp(self): self.d = webdriver.Chrome() self.d.implicitly_wait(10) self.d.get('http://10.1.30.75/pams/front/login.do') def test_denglu(self): d = self.d d.find_element_by_id('loginName').send_keys('student') d.find_element_by_id('password').send_keys('student') d.find_element_by_tag_name('button').click() def test_denglu1(self): d = self.d d.find_element_by_id('loginName').send_keys('student') d.find_element_by_id('password').send_keys('student') d.find_element_by_tag_name('button').click() d.find_element_by_link_text('个人信息') def tearDown(self): time.sleep(0.5) self.d.quit() if __name__ == '__main__': unittest.main()
1、导入csv代码库;
2、以只读形式打开文件;
3、由于打开文件的数据不能够直接查看,所以要将打开文件的数据进行格式转换;
4、使用for循环将所有的数据进行打印,但是不包括第一行标题数据。
'''案例描述
在自己的电脑新建一个csv文件,
文件里面存在数据,然后通过代码进行读取,
读取的时候去除第一行的标题数据。'''
import csv # 导入csv代码库
def read(): # 将数据读取存在一个方法中,方便后面被调用
path = r"D:\JetBrains\rczidonghua\zdhcs.csv"
stream = open(path,'r')
# 以只读的形式打开文件
data = csv.reader(stream)
# 进行数据格式转换
list = [] # 将读取的数据存放到list中
i = 0
for row in data:
if i != 0 :
list.append(row)
i = i + 1
return list
if __name__ == '__main__':
data = read()
for row in data:
print(row)
(1)、首先在头部导入ddt代码库,import ddt;
(2)、在测试类前添加一个装饰器,表示这个类采用ddt代码库的方式实现数据驱动(@ddt.ddt);
(3)、在测试方法前使用@ddt.data()指定数据来源。
(4)调用方法记得要用test_denglu(self,list):传参数
(5)调用send_keys(list[0]),
先将测试数据单独存在,然后再编写脚本的时候调用存放的数据,逐条进行数据的读取
'''案例步骤:
1、进入资产管理系统登录页面;
2、输入任务ID、用户名和密码,点击登录按钮;
3、点击供应商按钮;
4、在供应商页面中的供应商名称输入框中输入多组数据进行查询。
'''
import csv
def readxnr():
stream = open(r"D:\JetBrains\rczidonghua\shujuqudong.csv",'r')
data = csv.reader(stream)
list=[]
i=0
for row in data:
if i != 0:
list.append(row)
i = i+1
return list
# if __name__ == '__main__':
# data = readxnr()
# for row in data:
# print(row)
import unittest
import ddt
import time
from selenium import webdriver
from shiXun_Test.shujuqudong.readxnr import readxnr
@ddt.ddt
# ddt装饰器
class Pxnr(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
time.sleep(1)
self.d.quit()
stream_info = readxnr()
# 创建一个变量来接收数据
@ddt.data(*stream_info)
def test_pxnr(self,list):
d = self.d
d.get("http://10.1.30.75/pams/front/login.do")
# 进入到资产管理系统登录页面
d.find_element_by_name('loginName').send_keys("student")
# 输入用户名
d.find_element_by_name('password').send_keys("student")
# 输入密码
d.find_element_by_tag_name('button').click()
# 点击登录按钮
d.find_element_by_link_text("供应商").click()
# 点击供应商按钮
d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[3]/input').send_keys(list[0])
# 在供应商名称输入框中分别输入读取的数据
d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[4]/button').click()
# 点击查询按钮
time.sleep(2)
if __name__ == '__main__':
unittest.main()
# 调用unittest.main()启动测试
主要是send_keys(list[0])
@ddt.data(*stream_info)
:使用ddt装饰器,将stream_info中的数据传入测试方法。通过使用装饰器,可以迭代传入的数据集,并多次执行测试方法。
def test_pxnr(self, list):
:定义了一个名为test_pxnr的测试方法,它有一个参数list。
import ddt
import os
import time
import unittest
from selenium import webdriver
from shiXun_Test.shujuduanyan.readdenglu import readdenglu
@ddt.ddt
# ddt修饰器
class Denglu(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
time.sleep(1)
self.d.quit()
stream_info=readdenglu()
@ddt.data(*stream_info)
def test_denglu(self,list):
try:
d = self.d
d.get('http://10.1.30.75/pams/front/login.do')
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
d.find_element_by_link_text('部门管理').click()
d.find_element_by_xpath('//*[@id="content"]/div[2]/div/div[1]/button').click()
d.find_element_by_id('title').send_keys(list[0])
d.find_element_by_id('submitButton').click()
time.sleep(1)
d.switch_to.alert.accept()
# 弹出框处理
element = d.switch_to.alert.text
# print(element)
# 定位实际结果
self.assertEqual(element, list[1])
# 对数据进行断言
time.sleep(2)
except:
current_time = time.strftime('%Y-%m-%d_%H_%M_%S')
# 获取当前系统时间
current_path = os.path.dirname(__file__)
# 获取当前绝对路径
path = current_path+'\\'+current_time+'.png'
# 路径转换
print(path)
# print('页面标题:',d.title)
# print('页面网址',d.current_url)
d.get_screenshot_as_file(path)
# 截图
if __name__ == '__main__':
unittest.main()
try,except
d.switch_to.alert.accept()
# 弹出框处理
element = d.switch_to.alert.text
# print(element)
# 定位实际结果
self.assertEqual(element, list[1])
# 对数据进行断言
current_time = time.strftime('%Y-%m-%d_%H_%M_%S')
# 获取当前系统时间
current_path = os.path.dirname(__file__)
# 获取当前绝对路径
path = current_path+'\\'+current_time+'.png'
# 路径转换
1.driver.switch_to.alert.accept()#重要弹出窗口要接受后才能截屏
[email protected](*readdenglu())要有括号
1.将这些用例按照测试功能进行拆分,分散到不同的测试文件中。这时候我们可以通过discover方法来执行所有的测试用例
discover(start_dir,pattern='test*.py')
2.
2.找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
start_dir:要测试的模块名或测试用例目录
pattern='test*.py':表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符
import unittest
test_dir='./test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 默认不加括号,需要加括号
runner.run(discover)
主要是 test_dir = './test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
import unittest
from HTMLTestRunner import HTMLTestRunner
import time
test_dir = './test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__ == '__main__':
report_dir='./test_report'
# 测试报告存放位置
now = time.strftime('%Y-%m-%d_%H_%M_%S')
# 时间戳
report_name = report_dir+'\\'+now+'result.html'
# 文件命名
with open(report_name,'wb') as f:
runner = HTMLTestRunner(stream=f,title="Test Report",description="test HR")
runner.run(discover)
f.close()
主要是 with open(report_name,'wb') as f:
runner = HTMLTestRunner(stream=f,title="Test Report",description="test HR")
runner.run(discover)
f.close()
=================================================================
弹出框
element = d.switch_to.alert.text
●assert <表达式>[,<打印信息>] 是语句,而非函数,不需要加括号调用.
例如:assert isinstance(n, int), " 参数n必须是整数"
这里的assert amin in atist and all(amin <= X for X in alist)
这段代码是一个断言语句,用于进行条件检查和错误处理。让我来详细解释一下这段代码的含义:
amin in artist
:这个部分检查变量amin
是否存在于列表artist
中。如果amin
存在于artist
,结果为True
;否则,结果为False
。
all(amin <= X for X in alist)
:这个部分使用了一个生成器表达式和all()
函数。生成器表达式(amin <= X for X in alist)
会迭代列表alist
中的每个元素X
,并检查是否满足条件amin <= X
。如果所有的元素都满足条件,生成器表达式的结果为True
;如果有至少一个元素不满足条件,结果为False
。
assert
:assert
是 Python 中的一个关键字,用于进行断言。如果断言表达式为True
,则程序继续正常执行;如果断言表达式为False
,则抛出AssertionError
异常。在这个代码中,我们使用assert
来检查条件是否满足。如果条件满足,断言成功,程序继续执行;如果条件不满足,断言失败,AssertionError
异常被抛出。综合起来,这段代码的含义是:
- 首先,它检查变量
amin
是否存在于列表artist
中,如果不存在,则断言失败,抛出AssertionError
异常。- 然后,它对列表
alist
中的每个元素X
进行检查,确保所有元素都满足条件amin <= X
。如果有任何元素不满足条件,断言失败,抛出AssertionError
异常。- 如果以上两个条件都满足,断言成功,程序继续执行。
断言和try except区别:
是两种不同的错误处理机制。
断言用于在代码中检查特定条件是否为真,并在条件为假时引发异常。它通常用于调试和测试代码,以确保代码的正确性。可以使用Python中的assert语句来实现断言。
以下是使用assert语句的示例:
x = 2 assert x == 1, "x不等于1"
在这个例子中,如果x不等于1,那么将引发一个AssertionError,并且错误消息将是“x不等于1”。
try except语句用于捕捉和处理代码中的异常。它允许您在发生异常时执行备用代码路径或提供有关错误的详细信息。
以下是使用try except语句的示例:
try: x = 1 / 0
except ZeroDivisionError: print("不能除以零")
在这个例子中,如果尝试除以零,则会引发一个ZeroDivisionError,并且程序将打印“不能除以零”。
每一个测试用例都是一个unittest。而discover就是要这几个以test开头文件的。
(1)使用时,先在类名上,声明ddt,写法:@ddt;
(2)再在函数上,声明数据,写法:@(*数据列表名称) 例如:@(*list1);----注意这里有星号,把数据解包。
1、首先在头部导入ddt代码库,import ddt;
2、在测试类前添加一个装饰器,表示这个类采用ddt代码库的方式实现数据驱动(@ddt.ddt);
3、在测试方法前使用@ddt.data()指定数据来源。
(1) @ddt.ddt --- 装饰类,也就是继承自 TestCase 的类;
(2) @ddt.data --- 装饰测试方法,参数是一系列的值。
(3) @ddt.file_data --- 装饰测试方法,参数是文件名。文件可以是 json 或 yaml 类型,除.yaml结尾的文件,其他文件均会作为json文件处理。
(4)@ ddt.unpack --- 传递的是复杂的数据结构是使用。如:元组或列表。添加到 unpack 上之后,ddt 会自动把元组或者列表对应到多个参数上。
步骤一:test_dir='./test_case'
步骤二:discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
再运行
使用unittest.defaultTestLoader.discover
方法来发现符合模式"test*.py"
的测试模块。
def open(self): self._open(self.url)
open
方法是一个在示例类中定义的实例方法。该方法使用self
作为参数,self1
代表当前实例对象。在这个方法中,调用了另一个私有方法_open
,并将当前对象的url
属性作为参数传递给_open
方法。||这意味着open
方法会调用_open
方法,并将当前对象的url
作为参数进行处理。
参考:
(44条消息) 自动化测试学习笔记XD_"execute_script(\"arguments[0].removeattribute('ta_Keepyourself_XD的博客-CSDN博客