前言
一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210422。
8、用ddt思想重构项目
- Selenium读取CSV文件
- Selenium读取XML文件
- Selenium读取json文件
- Selenium 读取excel文件
- Selenium读取ini配置文件
- Selenium读取数据库数据
- Selenium参数化测试
- Selenium ddt
- 使用ddt思想重构项目
实操:基于unittest框架,借助ddt模块,使用xml文件作为测试输入
1、创建test.xml
<?xml version = "1.0" encoding = "utf-8"?>
<bookList type = "technology">
<book>
<name>selenium xml datadriven</name>
<author>小慌慌</author>
</book>
<book>
<name>selenium excel datadriven</name>
<author>小慌慌</author>
</book>
<book>
<name>selenium ddt data list</name>
<author>小慌慌</author>
</book>
</bookList>
2、解析XML文件。ParseXMLUtil.py
# encoding = utf-8
import os
from xml.etree import ElementTree
class ParseXML(object):
def __init__(self, xmlPath):
self.xmlPath = xmlPath
def getRoot(self):
# 打开将要解析的XML文件
tree = ElementTree.parse(self.xmlPath)
# 获取XML文件的根节点对象,然后返回给调用者
return tree.getroot()
def findNodeByName(self, parentNode, nodeName):
# 通过节点的名字获取节点对象
nodes = parentNode.findall(nodeName)
return nodes
def getNodeofChildText(self, node):
# 获取节点node下所有子节点的节点名作为key,本节点作为value组成的字典对象
childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}
# 上面代码等价于
'''
childrenTextDict = {}
for i in list(node.iter())[1:]:
fhildrenTextDict[i.tag] = i.text
'''
return childrenTextDict
def getDataFromXml(self):
# 获取XML文档的根节点对象
root = self.getRoot()
# 获取根节点下所有名为book的节点对象
books = self.findNodeByName(root, "book")
dataList = []
# 遍历获取到的所有book节点对象
# 取得需要的测试数据
for book in books:
childrenText = self.getNodeofChildText(book)
dataList.append(childrenText)
return dataList
if __name__ == "__main__":
xml = ParseXML(r"/Users/ff/PycharmProjects_py3/Selenium_project/testcases/ddt/test.xml")
datas = xml.getDataFromXml()
for i in datas:
print(i["name"], i["author"])
运行结果:
selenium xml datadriven 小慌慌
selenium excel datadriven 小慌慌
selenium ddt data list 小慌慌
3、测试脚本。test_xml.py
# encoding = utf-8
import os
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException
from testcases.ddt.ParseXMLUtil import ParseXML
# 初始化日志对象
logging.basicConfig(
# 日志级别
level=logging.INFO,
# 时间、代码所在文件名、代码行号、日志级别名字、日志信息
format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',
# 打印日志的时间
datefmt='%a, %d %b %Y %H:%M:%S',
# 日志文件存放的目录及日志文件名
filename='/Users/ff/PycharmProjects_py3/Selenium_project/logs',
# 打开日志的方式
filemode='w'
)
currentPath = os.path.dirname(os.path.abspath(__file__))
dataFilePath = os.path.join(currentPath, "test.xml")
print(dataFilePath)
# 创建ParseXML类实例对象
xml = ParseXML(dataFilePath)
@ddt.ddt
class DataDrivenTestByXML(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
@ddt.data(*xml.getDataFromXml())
def test_dataDrivenByXML(self, data):
testData, expectData = data["name"], data["author"]
self.driver.get('http://www.baidu.com')
self.driver.implicitly_wait(10)
try:
self.driver.find_element_by_id("kw").send_keys(testData)
self.driver.find_element_by_id("su").click()
time.sleep(3)
self.assertTrue(expectData in self.driver.page_source)
except NoSuchElementException as e:
logging.error(u"查找的页面元素不存在,异常堆栈信息为:" + str(traceback.format_exc()))
except AssertionError as e:
logging.info(u"搜索 ‘%s’,期望 ‘%s’ ,失败" % (testData, expectData))
except Exception as e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
else:
logging.info(u"搜索 ‘%s’,期望 ‘%s’ ,通过" % (testData, expectData))
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()