JSON数据文件[List]

方式一

[
  "北京||北京","上海||上海","广州||广州","深圳||深圳","香港||香港"
]

测试代码

# encoding = utf-8
"""
__title__ = ''
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
"""
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException

# 初始化日志对象
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='F:\\DataDriven\\TestResults\TestResults.TestResults',
    # 打开日志的方式
    filemode='w'
)


@ddt.ddt
class DataDrivenTestByDDTHTR(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(executable_path="F:\\automation\\webdriver\\chromedriver.exe")

    # json文件所在路径
    @ddt.file_data("F:\\DataDriven\\testData\\test_data_list.json")
    def test_dataDrivenHTRByFile(self, value):
        url = "http://www.baidu.com"
        self.driver.get(url)
        self.driver.maximize_window()
        print(value)
        # 将从.json文件中读取出的数据用“||”分割成测试数据和期望的数据
        testdata, execptdata = tuple(value.strip().split("||"))
        # 设置隐式等待时间
        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(execptdata 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, execptdata))
        except Exception as e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
        else:
            logging.info(u"搜索 '%s',期望 '%s' ,通过" % (testdata, execptdata))

    def tearDown(self):
        self.driver.quit()


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

方式二

测试报告模板

# encoding = utf-8
"""
__title__ = 'DataDrivenTestByDDT use this template for generating testing report'
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
"""
# encoding = utf-8
def htmlTemplate(trData):
    htmlStr = u'''<!DOCTYPE HTML>
    <html>
    <head>
    <title>单元测试报告</title>
    <style>
    body {
        width:80%;
        margin:40px auto;
        font-weight:bold;
        font-family: 'trebuchet MS', 'Lucida sans', SimSun;
        font-size:18px;
        color: #000;
    }
    table {
        * border-collapse:collapse;
        border-spacing:0;
        width:100%;
    }
    .tableStyle {
        /* border:solid #ggg 1px;*/
        border-style:outset;
        border-width:2px;
        /*border:2px;*/
        border-color:blue;
    }
    .tableStyle tr:hover {
        background: rgb(173.216.230);
    }
    
    .tableStyle td,.tableStyle th{
        border-left:solid 1px rgb(146,208,80);
        border-top:1px solid rgb(146,208,80);
        padding:15px
        text-align:center
    }
    .tableStyle th{
        padding:15px;
        background-color:rgb(146,208,80);
        /*表格标题栏设置渐变颜色*/
        background-image: -webkit -gradient(linear, left top, left bottom, from(#92D050), to(#A2D668))
        /*rgb(146,208,80)*/
    }     
    </style>
    </head>
    <body>
        <center><h1>测试报告</h1></center><br />
        <table class="tableStyle">
            <thead>
            <tr>
            <th>Search Words</th>
            <th>Assert Words</th>
            <th>Start Time</th>
            <th>Waste Time(s)</th>
            <th>Status</th>
            </tr>
            </thead>'''
    endStr = u'''
        </table>
    </body>
    </html>'''
    html = htmlStr + trData + endStr
    print(html)
    with open("D:\\\Programs\\\Python\\\PythonUnittest\\\Reports\\testTemplate.html", "wb") as fp:
        fp.write(html.encode("gbk"))

测试脚本

# encoding = utf-8
"""
__title__ = ''
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
"""
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from DataDrivenTest.ReportTemplate import htmlTemplate
from selenium.common.exceptions import NoSuchElementException
 
# 初始化日志对象
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='D:\\Programs\\Python\\PythonUnittest\\Reports\\TestResults.TestResults',
    # 打开日志的方式
    filemode='w'
)
 
 
@ddt.ddt
class DataDrivenTestByDDT(unittest.TestCase):
 
    @classmethod
    def setUpClass(cls):
        # 整个测试过程只调用一次
        DataDrivenTestByDDT.trStr = ""
 
    def setUp(self):
        self.driver = webdriver.Chrome(executable_path="D:\\Programs\\Python\\PythonUnittest\\BrowserDrivers\\chromedriver.exe")
        status = None  # 用于存放测试结果状态,失败‘fail’,成功‘pass’
        flag = 0  # 数据驱动测试结果的标志,失败置0,成功置1
 
    @ddt.file_data("D:\\Programs\\Python\\PythonUnittest\\TestData\\test_data_list.json")
    def test_dataDrivenByFile(self, value):
        # 决定测试报告中状态单元格中内容的颜色
        flagDict = {0: 'red', 1: '#00AC4E'}
 
        url = "http://www.baidu.com"
        self.driver.get(url)
        self.driver.maximize_window()
        print(value)
        # 从.json文件中读取出的数据用“||”分割成测试数据和期望的数据
        testdata, execptdata = tuple(value.strip().split("||"))
        # 设置隐式等待时间
        self.driver.implicitly_wait(10)
 
        try:
            # 获取当前的时间戳,用于后面计算查询耗时用
            start = time.time()
            # 获取当前时间的字符串,表示测试开始时间
            startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            self.driver.find_element_by_id("kw").send_keys(testdata)
            self.driver.find_element_by_id("su").click()
            time.sleep(3)
            # 断言期望结果是否出现在页面中
            self.assertTrue(execptdata in self.driver.page_source)
        except NoSuchElementException as e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息为:"+ str(traceback.format_exc()))
            status = 'fail'
            flag = 0
        except AssertionError as e:
            logging.info(u"搜索 ‘%s’,期望 ‘%s’ ,失败" %(testdata, execptdata))
            status = 'fail'
            flag = 0
        except Exception as e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
            status = 'fail'
            flag = 0
        else:
            logging.info(u"搜索 ‘%s’,期望 ‘%s’ ,通过" %(testdata, execptdata))
            status = 'pass'
            flag = 1
        # 计算耗时,从将测试数据输入到输入框中到断言期望结果之间所耗时
            wasteTime = time.time() - start - 3  # 减去强制等待3秒
        # 每一组数据测试结束后,都将其测试结果信息插入表格行的HTML代码中,并将这些行HTML代码拼接到变量trStr变量中,
        # 等所有测试数据都被测试结束后,传入htmlTemplate()函数中,生成完整测试报告的HTML代码
            DataDrivenTestByDDT.trStr += u'''
            <tr>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%.2f</td>
                <td style = "color: %s">%s</td>
            </tr><br/>''' % (testdata, execptdata, startTime, wasteTime, flagDict[flag], status)
 
    def tearDown(self):
        self.driver.quit()
 
    @classmethod
    def tearDownClass(cls):
        # 写自定义的HTML测试报告,整个过程只被调用一次
        htmlTemplate(DataDrivenTestByDDT.trStr)
 
 
if __name__ == '__main__':
    unittest.main()

生成日志

Fri, 07 Dec 2018 15:05:36 DataDrivenTestByDDT.py[line: 81] INFO 搜索 ‘北京’,期望 ‘北京’ ,通过
Fri, 07 Dec 2018 15:05:50 DataDrivenTestByDDT.py[line: 81] INFO 搜索 ‘上海’,期望 ‘上海’ ,通过
Fri, 07 Dec 2018 15:06:04 DataDrivenTestByDDT.py[line: 81] INFO 搜索 ‘广州’,期望 ‘广州’ ,通过
Fri, 07 Dec 2018 15:06:18 DataDrivenTestByDDT.py[line: 81] INFO 搜索 ‘深圳’,期望 ‘深圳’ ,通过
Fri, 07 Dec 2018 15:06:32 DataDrivenTestByDDT.py[line: 81] INFO 搜索 ‘香港’,期望 ‘香港’ ,通过

HTML报告

Python自动化测试系列[v1.0.0][数据驱动DDTJSON]_html

JSON数据文件[字典]

除了在json文件中放置List类型的数据,还可以放置Dict类型的数据,在PO项目的TestData路径下新建一个文件,并命名为login.json,然后在文件中写入如下测试数据。

{
  "test_login_01": {
    "username":"",
    "password":"davieyang",
    "assert_text": "请输入帐号"
  },
  "test_login_02": {
    "username":"davieyang",
    "password":"",
    "assert_text": "请输入密码"
  },
  "test_login_03":{
    "username":"error",
    "password":"error",
    "assert_text": "帐号或密码错误"
  }
}

测试脚本

# -*- coding: utf-8 -*-
import unittest
from selenium import webdriver
from ddt import ddt, file_data
import time
# 引入NoSuchElementException异常类
from selenium.common.exceptions import NoSuchElementException
from Configuration import ConstantConfig
#  定义测试数据文件
login_json = ConstantConfig.jsondictdata

@ddt
class TestLogin(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.url = "http://mail.163.com"
        self.driver.implicitly_wait(10)
    def user_login_163(self, username, password):
        driver = self.driver
        driver.get(self.url)
        # 定义frame,他是页面中的iframe控件
        frame = self.driver.find_element_by_xpath("//*[@id='loginDiv']/iframe")
        time.sleep(1)
        try:
            self.driver.switch_to.frame(frame)  # 切换进iframe控件
            self.driver.find_element_by_name("email").send_keys(username)  # 输入用户名
            self.driver.find_element_by_name("password").send_keys(password)  # 输入密码
            self.driver.find_element_by_id("dologin").click()  # 点击登陆按钮
        except NoSuchElementException as e:
            # 将未找到页面元素的异常记录进日志
            raise e
        except Exception as e:
            raise e
    @file_data(login_json)
    def test_login(self, username, password, assert_text):  # 定义测试方法
        self.user_login_163(username, password)  # 调用登陆163的方法
        message = self.driver.find_element_by_id("nerror").text  
        self.assertEqual(message, assert_text)  # 断言
    def tearDown(self):
        self.driver.quit()
if __name__ == '__main__':
    unittest.main(verbosity=2)