51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1597|回复: 1
打印 上一主题 下一主题

怎样从0开始搭建一个测试框架_1——配置

[复制链接]
  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-3-28 15:44:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我们先创建一个简单的脚本吧,在test文件夹创建test_baidu.py:
    1. <font face="宋体" size="3">import os
    2. import time
    3. from selenium import webdriver
    4. from selenium.webdriver.common.by import By

    5. URL = "http://www.baidu.com"
    6. base_path = os.path.dirname(os.path.abspath(__file__)) + '\..'
    7. driver_path = os.path.abspath(base_path+'\drivers\chromedriver.exe')

    8. locator_kw = (By.ID, 'kw')
    9. locator_su = (By.ID, 'su')
    10. locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')

    11. driver = webdriver.Chrome(executable_path=driver_path)
    12. driver.get(URL)
    13. driver.find_element(*locator_kw).send_keys('selenium 灰蓝')
    14. driver.find_element(*locator_su).click()
    15. time.sleep(2)
    16. links = driver.find_elements(*locator_result)
    17. for link in links:
    18.     print(link.text)
    19. driver.quit()</font>
    复制代码
    如果想要搜索“Python selenium”,是不是要再创建一个脚本?还是把原来的脚本修改一下?

    或者我们可以用unittest来改一下,把两次搜索分别写一个测试方法:
    1. <font face="宋体" size="3">import os
    2. import time
    3. import unittest
    4. from selenium import webdriver
    5. from selenium.webdriver.common.by import By


    6. class TestBaiDu(unittest.TestCase):
    7.     URL = "http://www.baidu.com"
    8.     base_path = os.path.dirname(os.path.abspath(__file__)) + '\..'
    9.     driver_path = os.path.abspath(base_path+'\drivers\chromedriver.exe')

    10.     locator_kw = (By.ID, 'kw')
    11.     locator_su = (By.ID, 'su')
    12.     locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')

    13.     def setUp(self):
    14.         self.driver = webdriver.Chrome(executable_path=self.driver_path)
    15.         self.driver.get(self.URL)

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

    18.     def test_search_0(self):
    19.         self.driver.find_element(*self.locator_kw).send_keys('selenium 灰蓝')
    20.         self.driver.find_element(*self.locator_su).click()
    21.         time.sleep(2)
    22.         links = self.driver.find_elements(*self.locator_result)
    23.         for link in links:
    24.             print(link.text)

    25.     def test_search_1(self):
    26.         self.driver.find_element(*self.locator_kw).send_keys('Python selenium')
    27.         self.driver.find_element(*self.locator_su).click()
    28.         time.sleep(2)
    29.         links = self.driver.find_elements(*self.locator_result)
    30.         for link in links:
    31.             print(link.text)


    32. if __name__ == '__main__':
    33.     unittest.main()</font>
    复制代码
    现在,我们把配置抽出来放到config.yml中:
    1. <font face="宋体" size="3">URL: http://www.baidu.com</font>
    复制代码
    为了读取yaml文件,我们需要一个封装YamlReader类,在utils中创建file_reader.py文件:
    1. <font face="宋体" size="3">import yaml
    2. import os


    3. class YamlReader:
    4.     def __init__(self, yamlf):
    5.         if os.path.exists(yamlf):
    6.             self.yamlf = yamlf
    7.         else:
    8.             raise FileNotFoundError('文件不存在!')
    9.         self._data = None

    10.     @property
    11.     def data(self):
    12.         # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据
    13.         if not self._data:
    14.             with open(self.yamlf, 'rb') as f:
    15.                 self._data = list(yaml.safe_load_all(f))  # load后是个generator,用list组织成列表
    16.         return self._data</font>
    复制代码
    而且我们需要一个Config类来读取配置,config.py:
    1. <font face="宋体" size="3">"""
    2. 读取配置。这里配置文件用的yaml,也可用其他如XML,INI等,需在file_reader中添加相应的Reader进行处理。
    3. """
    4. import os
    5. from utils.file_reader import YamlReader

    6. # 通过当前文件的绝对路径,其父级目录一定是框架的base目录,然后确定各层的绝对路径。如果你的结构不同,可自行修改。
    7. # 之前直接拼接的路径,修改了一下,用现在下面这种方法,可以支持linux和windows等不同的平台,也建议大家多用os.path.split()和os.path.join(),不要直接+'\\xxx\\ss'这样
    8. BASE_PATH = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
    9. CONFIG_FILE = os.path.join(BASE_PATH, 'config', 'config.yml')
    10. DATA_PATH = os.path.join(BASE_PATH, 'data')
    11. DRIVER_PATH = os.path.join(BASE_PATH, 'drivers')
    12. LOG_PATH = os.path.join(BASE_PATH, 'log')
    13. REPORT_PATH = os.path.join(BASE_PATH, 'report')


    14. class Config:
    15.     def __init__(self, config=CONFIG_FILE):
    16.         self.config = YamlReader(config).data

    17.     def get(self, element, index=0):
    18.         """
    19.         yaml是可以通过'---'分节的。用YamlReader读取返回的是一个list,第一项是默认的节,如果有多个节,可以传入index来获取。
    20.         这样我们其实可以把框架相关的配置放在默认节,其他的关于项目的配置放在其他节中。可以在框架中实现多个项目的测试。
    21.         """
    22.         return self.config[index].get(element)</font>
    复制代码
    修改test_baidu.py:
    1. <font face="宋体" size="3">import time
    2. import unittest
    3. from selenium import webdriver
    4. from selenium.webdriver.common.by import By
    5. from utils.config import Config, DRIVER_PATH


    6. class TestBaiDu(unittest.TestCase):
    7.     URL = Config().get('URL')

    8.     locator_kw = (By.ID, 'kw')
    9.     locator_su = (By.ID, 'su')
    10.     locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')

    11.     def setUp(self):
    12.         self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')
    13.         self.driver.get(self.URL)

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

    16.     def test_search_0(self):
    17.         self.driver.find_element(*self.locator_kw).send_keys('selenium 灰蓝')
    18.         self.driver.find_element(*self.locator_su).click()
    19.         time.sleep(2)
    20.         links = self.driver.find_elements(*self.locator_result)
    21.         for link in links:
    22.             print(link.text)

    23.     def test_search_1(self):
    24.         self.driver.find_element(*self.locator_kw).send_keys('Python selenium')
    25.         self.driver.find_element(*self.locator_su).click()
    26.         time.sleep(2)
    27.         links = self.driver.find_elements(*self.locator_result)
    28.         for link in links:
    29.             print(link.text)


    30. if __name__ == '__main__':
    31.     unittest.main()</font>
    复制代码
    我们已经把配置分离出来了,虽然现在看起来似乎很麻烦,但是想想如果你有50个用例文件甚至更多,一旦项目URL变了,你还要一个个去修改吗?
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 10:28 , Processed in 0.069039 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表