webから自動python自動化(3):4 .テストの枠組みを…

2。枠組みアルベエル?

1.1実装日誌プリント

我々はどう実装日誌印刷の場合では、これらの公共の方法を使用。

自動化テストの時は、我々は記録日誌測位の助けに問題が必要です。

(2)設置日誌出力様式

我々の日誌出力の時は、一定のフォーマットである。

logger_format = logging.Formatter('%(asctime)s-%(levelname)s-%(message)s-%(filename)s-%(lineno)d-%(funcName)s')
%(levelno)s:打印日志级别的数值。
%(levelname)s:打印日志级别的名称。
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]。
%(filename)s:打印当前执行程序名。
%(funcName)s:打印日志的当前函数。
%(lineno)d:打印日志的当前行号。
%(asctime)s:打印日志的时间。
%(thread)d:打印线程ID。
%(threadName)s:打印线程名称。
%(process)d:打印进程ID。
%(processName)s:打印线程名称。
%(module)s:打印模块名称。
%(message)s:打印日志信息。

2 . basepageパッケージ

一部テスト事業の業務とは無関係なブラウザ方法、独立できる、単独basepageにパッケージ。

例えば、ページの元素の位置に対して、我々は内蔵のapiでかかる日誌添加。

今我々は実装元素検索を例に

(2)コードの実装の最適化

我々の后、他の機能は増えるかも我々は加一機能すればこの関数でコードが増え、この関数はますます巨大につながる。

最適化方法:

  • インテリア器を最適化(今回…)
  • デザインモデルを最適化

我々の元素に饰器モデルを使って測位ブラックリスト機能を増加した。
ブラックリスト処理、我々ui自動化テストの時、予想が当って未窓の弾のよう。

インテリア器コード:

def black_list_find(func):
    """
    自定义装饰器:给元素定位方法增加黑名单功能
    :param func:
    :return:
    """
    @wraps(func)
    def wrapper(*args,**kwargs):
        try:
            res = func(*args,**kwargs)
        except Exception as e:
            # 添加黑名单功能,当元素查找失败时。遍历黑名单
            config.case_log.info(f'查找元素失败,开始遍历黑名单')
            for black in self.black_list:
                black_eles = self._find_elments(*black)
                if len(black_eles) > 0:
                    black_eles[0].click()
                    config.case_log.info(f'查找黑名单元素成功')
                    return func(*args,**kwargs)
            config.case_log.error(f'遍历黑名单元素结束,未找到黑名单元素')
            raise e
        return res

    return wrapper

page_base . pyコード:

class BasePage:
    def __init__(self,driver:WebDriver):
        if driver:
            self.driver = driver
        else:
            self.driver = webdriver.Chrome(executable_path=r'E:\project\xiaoxiong_test_frame\web_frame\plugin\chromedriver.exe')
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)
        self.base_log = MyLogger().get_logger()

    @black_list_find
    def find_element(self,method,message):
        """
        封装元素定位方法。增加日志打印
        :param method: 定位元素的方法,例如xpath,id,css等
        :param message: 需定位元素的信息,例如:kw等
        :return:
        """
        try:
            if method == 'id':
                self.driver.find_element_by_id(message)
                self.base_log.info(f'find element "(method:{method}, message:{message})" success')
            elif method == 'xpath':
                self.driver.find_element_by_xpath(message)
                self.base_log.info(f'find element "(method:{method}, message:{message})" success')
        except  Exception as e:
            self.base_log.error(f'find element "(method:{method}, message:{message})" failed. the reason is {e}')
            raise Exception(f'find element "(method:{method}, message:{message})" failed')

    @black_list_find
    def find_elements(self,method,message):
        """
        封装元素定位方法。增加日志打印
        :param method: 定位元素的方法,例如xpath,id,css等
        :param message: 需定位元素的信息,例如:kw等
        :return:
        """
        try:
            if method == 'id':
                self.driver.find_elements_by_id(message)
                self.base_log.info(f'find elements "(method:{method}, message:{message})" success')
            elif method == 'xpath':
                self.driver.find_elements_by_xpath(message)
                self.base_log.info(f'find elements "(method:{method}, message:{message})" success')
        except  Exception as e:
            self.base_log.error(f'find elements "(method:{method}, message:{message})" failed. the reason is {e}')
            raise Exception(f'find elements "(method:{method}, message:{message})" failed')

饰器を使っては再びパッケージを出て、いくつかの機能が有効コードの冗長性を減らす。

4 .テスト报告

使用allure生成日誌报告

pytest test_clac.py --alluredir report # 会创建一个report文件夹,里面有许多测试数据的json文件
allure generate ./report # 会创建一个allure-report文件,里面有html格式的测试报告,可以使用-o来自己指定想要生成的文件名字
if __name__ == "__main__":
    json_path = os.path.join(config.BASE_DIR,f'report/allure_result/{get_now_time()}') # 指定生成的json报告文件的路径
    html_path = os.path.join(config.BASE_DIR,f'report/allure_report/{get_now_time()}') # 指定生成的html报告文件的路径
    pytest.main(['-vs','test_markpage_search.py', f'--alluredir={json_path}'])
    os.system(f'allure generate {json_path} -o {html_path}')

もし伞

はは設置しなかったallure—pytestプラグイン

6 .キーワード駆動

キーワード駆動は今から自動テストはますます流行の一种である。

ここに一例で講義キーワード駆動

(2)使用キーワード駆動

キーワード駆動を我々ができる元素情報、および、元素の操作方法と书yamlである。

yamlファイル:

注意は、コードの遍暦の元素の情報では、関連の操作を行い、だから元素yamlで情報の順に業務と対応が必要だ。

# filename = main_page.yaml
goto_mark: #main页面中函数goto_mark中的元素内容
  - message: com.xueqiu.android:id/post_status #元素属性值
    method: id #元素定位方式
    element: 首页》悬浮笔按钮 #元素描述,用于日志
    action: _wait_element_to_click #对该元素要进行的操作

  - message: com.xueqiu.android:id/post_status
    method: id
    element: 首页》悬浮笔按钮
    action: _find_element_and_click

  - message: //*[@resource-id="android:id/tabs"]//*[@text="行情"]
    method: xpath
    element: 首页》行情按钮首页》行情按钮
    action: _wait_element_to_click

  - message: //*[@resource-id="android:id/tabs"]//*[@text="行情"]
    method: xpath
    element: 首页》行情按钮
    action: _find_element_and_click
# filename = main_page.py
    def goto_mark(self):
        """
        首页》点击行情
        :return:
        """
        try:
            from appium.webdriver.common.mobileby import MobileBy
            with open(os.path.join(config.BASE_DIR,'page/main_page.yaml'),'r',encoding='utf-8') as f:
                data = yaml.safe_load(f)
                config.case_log.info(data)
                for step in data.get('goto_mark'):
                    if step['action'] == '_wait_element_to_click':
                        config.case_log.info('_wait_element_to_click')
                        self._wait_element_to_click(step['method'],step['message'],step['element'])
                    elif step['action'] == '_find_element_and_click':
                        config.case_log.info('_find_element_and_click')
                        self._find_element_and_click(step['method'],step['message'],step['element'])
                    else:
                        config.case_log.error('yaml中元素信息填写错误')
                        raise Exception('yaml中元素信息填写错误')
                return MarkPage(self._driver)
        except Exception as e:
            raise e
# 原理:取出yaml文件对应函数模块中的所有元素信息,根据action选择对应的操作方法,根据method和message确定元素。这样就实现了根据关键字来驱动业务。

(3)まとめ

  • キーワード駆動は今は流行の一種で、自動化テストの思想である。
  • キーワード駆動長所:1 .業務ができる論理をyamlに移し、コードのテストに精通しない者でもyamlで執筆测
  • キーワード駆動を結合の実態が必要かどうかを選択はどんな場合にも適用される。
  • 使用yamlキーワード駆動:一般の一つのページに対応yamlファイル;
ソースネットワーク 戻る