往往我們需要通過數據集合直接驅動應用,這裏通過循序漸進的三種方式來描述。
1. 通過csv獲取數據並驅動應用
baidu_data.csv文件如下:
name,search_key
case1,selenium
case2,unittest
case3,parameterized
test1_baidu_data.py文件如下:
import csv
import codecs
import unittest
from time import sleep
from itertools import islice
from selenium import webdriver
class TestBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = "https://www.baidu.com"
@classmethod
def tearDownClass(cls):
cls.driver.quit()
def baidu_search(self, search_key):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys(search_key)
self.driver.find_element_by_id("su").click()
sleep(3)
def test_search(self):
with codecs.open('baidu_data.csv', 'r', 'utf_8_sig') as f:
data = csv.reader(f)
for line in islice(data, 1, None):
search_key = line[1]
self.baidu_search(search_key)
if __name__ == '__main__':
unittest.main(verbosity=2)
結果:打開百度瀏覽器後,依次輸入關鍵字selenium,unittest,parameterized,依次得到三個搜索界面。
缺點:如果有一個數據沒有獲取到就會影響後續數據的解析。
2.將數據獲取後存儲到數組中,再創建不同測試方法使用數據
import csv
import codecs
import unittest
from time import sleep
from itertools import islice
from selenium import webdriver
class TestBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = "https://www.baidu.com"
cls.test_data = []
with codecs.open('baidu_data.csv', 'r', 'utf_8_sig') as f:
data = csv.reader(f)
for line in islice(data, 1, None):
cls.test_data.append(line)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
def baidu_search(self, search_key):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys(search_key)
self.driver.find_element_by_id("su").click()
sleep(3)
def test_search_selenium(self):
self.baidu_search(self.test_data[0][1])
def test_search_unittest(self):
self.baidu_search(self.test_data[1][1])
def test_search_parameterized(self):
self.baidu_search(self.test_data[2][1])
if __name__ == '__main__':
unittest.main(verbosity=2)
結果:先測試parameterized--selenium--unittest
3. 使用Parameterized實現參數化
1)安裝parameterized
pip install parameterized
2)實現百度搜索的測試
import unittest
from time import sleep
from itertools import islice
from selenium import webdriver
from parameterized import parameterized
class TestBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = "https://www.baidu.com"
@classmethod
def tearDownClass(cls):
cls.driver.quit()
def baidu_search(self, search_key):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys(search_key)
self.driver.find_element_by_id("su").click()
sleep(2)
# 通過Parameterized實現參數化,case1--定義測試用例的名稱,selenium--定義搜索的關鍵字
@parameterized.expand([
("case1", "selenium"),
("case2", "unittest"),
("case3", "parameterized"),
])
def test_search(self, name, search_key):
self.baidu_search(search_key)
self.assertEqual(self.driver.title, search_key + "_百度搜索")
if __name__ == '__main__':
#執行更詳細的執行日誌
unittest.main(verbosity=2)
步驟1)導入Parameterized
2)通過@parameterized.expand()裝飾測試用例
3)使用unittest的main方法,設置verbosity參數爲2,輸出更詳細的執行日誌。
得到的結果如下:
通過@parameterized.expand()中元組的個數來統計測試用例數,產生3條測試用例。