自動テストで退屈な操作を数秒で終わらせるには? PO パターン設計フレームワークを試す

はじめ
に 機能を更新するたびに大量の自動テスト コードを書き直して疲れを感じたことはありませんか?

または、ページ要素が頻繁に変更されるため、テスト スクリプトを常に修正する必要がありますか?

これらの悩みも抱えている場合は、PO パターン設計フレームワークが解決策になる可能性があります。これにより、自動化されたテスト コードをよりシンプルかつ効率的な方法で記述できるようになり、反復作業とエラー率が削減されます。

この記事では、PO モード デザイン フレームワークを使用して、面倒な自動テスト操作を数秒で終了し、刻々と変化するテスト環境に簡単に対処する方法を紹介します。

po モード
UI レベルの自動テストでは、オブジェクト デザイン モードとは、インタラクティブな Web アプリケーション、プログラム ユーザー インターフェイスの領域をテストすることを意味します。これにより、コードの重複が削減されます。つまり、ユーザー インターフェイスが変更された場合、1 つのプログラムを変更するだけで済みます。場所。

利点:
1. 複数のテスト ケースで共有できるコードを作成する

2. 重複コードの量を減らす

3. ユーザー インターフェイスが変更された場合、1 か所で維持するだけで済みます。

ui を作成し、対応するパッケージとディレクトリを ui プロジェクトに作成します。utils 最後のパッケージの名前

ディレクトリの説明:
各ディレクトリの詳細な説明:

(1) base: 基本層。主に下層のポジショニング要素のクラスを記述します。これはパッケージです。

(2) 共通: パブリック クラス。パブリックによって使用されるメソッドを記述します。

(3) config: 設定ファイル格納ディレクトリ。

(4) data: テストで使用するテストデータを格納します。

(5) ページ: オブジェクト層、特定のビジネス ロジックを記述し、ページの操作動作ごとに個別のメソッドまたは関数を記述します。

(6) report: テスト レポート ディレクトリ。主にテスト レポートの保存に使用されます。

(7) テスト: 主にテスト モジュールを含むテスト レイヤー。各テスト シナリオのコードとも言えます。

(8) utils: ファイル処理、ドキュメントなどのツール、ストレージ ツール。

(9) 実行: 実行レイヤー: 自動化されたテスト全体の実行中のディレクトリ。

ページオブジェクトのデザインパターン:
ベース ベースレイヤー:
基本的なコードは主にこのレイヤーに記述されます。この層では、主に WebUI クラスが定義されており、単一要素と複数要素の配置方法がこのクラスに記述されています。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
 
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import NoSuchElementException
import time as t
 
class WebUI(object):
    def __init__(self,driver):
        #webdriver实例化后的对象
        self.driver=driver
 
    def findElement(self,*args):
        '''
        单个元素定位的方式
        :param args:
        :return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
        '''
        try:
            return self.driver.find_element(*args)
        except NoSuchElementException as e:
            return e.args[0]
 
    def findsElement(self,*args,index):
        '''
        多个元素定位的方式
        :param args:
        :param index: 被定位的目标索引值
        :return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
        '''
        try:
            return self.driver.find_elements(*args)[index]
        except NoSuchElementException as e:
            return e.args[0]

ページ オブジェクト層:
この層のクラスは、基本層のクラスを直接継承し、各操作要素属性の値を class 属性のメソッドで指定し、操作手順 (操作など) に従って対応するメソッドを記述します。ログインについて: ユーザー名を入力し、パスワードを入力し、ログインをクリックすると、テキストを取得する情報操作がインスタンスに実装されたログイン操作になり、各ログイン操作をメソッドにカプセル化して、ログイン テスト ケースを直接呼び出すことができます。 、および失敗情報が返されます --- 正式なパラメーターはテストレイヤーで割り当てられます)

注: ファイル情報を取得するメソッドには戻り値が必要です。そうしないと、テスト レイヤーがアサートしたときにテキスト情報を取得できず、データ属性とメソッド名が同じであってはなりません。

 test: The test layer
needs to import the classes in the object layer and the unittest unit test framework. テスト クラスでは、 unittest.TestCase とオブジェクト レイヤーのクラスを継承します. TestCase は、自動化されたテスト ケースの記述に使用されます.テスト ファームウェア、テスト アサーション、およびテスト実行にはすべてそのメソッドが必要であり、オブジェクト レイヤーのクラスにはオブジェクト レイヤーのテスト操作ステップのメソッドが含まれており、継承後に直接呼び出すことができます。

予防:

1. ユースケースを記述する場合、ユースケースがテストのどの時点であり、どのシーンで検証されているかを明確に示すために、備考情報を追加する必要があります。

2. テスト モジュールはすべて test_ で始まり、テスト メソッドも test_ で始まります。

#! /usr/bin/env パイソン

# -*- コーディング:utf-8 -*-

# 作者: チャン・ホン

page.sina インポートから *

単体テストのインポート

セレンインポートウェブドライバーから

時刻を t としてインポート

page.init インポートから *

クラス SinaTest(Init、Sina):

    def test_username_null(self):

        self.login(ユーザー名='',パスワード='12345')

        t.sleep(3)

        #確認メール名が空です

        self.assertEqual(self.getUserError(), 'メールボックス名を入力してください')

        t.sleep(3)

    def test_username_supportChinese(self):

        self.login(username='中国',password='12345')

        t.sleep(3)

        # メールボックス名が中国語をサポートしていないことを確認する

        self.assertEqual(self.getUserError(), 'メールボックス名は中国語をサポートしていません')

        t.sleep(3)

    def test_username_formatError(self):

        self.login(ユーザー名='123',パスワード='12345')

        t.sleep(3)

        # メールボックス名の形式が間違っていることを確認します

        self.assertEqual(self.getUserError(), '入力したメールボックス名の形式が正しくありません')

    def test_password_null (自己):

        self.login(username='[email protected]',password='')

        t.sleep(3)

        # パスワードが空であることを確認する

        self.assertEqual(self.getPassError(), 'パスワードを入力してください')

        t.sleep(3)

    def test_login_error(self):

        self.login(username='[email protected]',password='724225')

        t.sleep(3)

        # ユーザー名認証エラー

        self.assertEqual(self.getUserError(), 'ログイン名またはパスワードのエラー')

        t.sleep(3)

データ データ層:

春先テストで使用したテストデータ(主にjsonファイル、yamlファイルに書き出す)

データの下にjsonファイルを作成します

 共通層:
共通: 一般に使用されるファイルが書き込まれる共通層 (処理パス --- 焦点は json ファイルまたは yaml ファイルにあります)。一般に基本パスを定義します。

1. このレイヤーに public.py ファイルを作成します

osライブラリをインポートし、基本パスを定義します(つまり、基本パスをファイルが読み込まれるフォルダのパスとして処理し、使用時にパススプライシングを行うと便利です)

 untils:
ツール層: 基本的にデータ内 (json yaml ファイルの読み取り)

untils の下にモジュールを作成します: operationJson.py、メソッド readJson() を設定してデータを読み取ります

このモジュールでは、パス スプライシング用に os をインポートし、ファイルを読み取るための Json デシリアライゼーションをインポートし、パブリック レイヤーの下に基本パスをインポートする必要があります。

 

構成レイヤー:

設定ファイル格納ディレクトリ

実行レイヤー:

操作レイヤーは、主にテストケースを実行するためのディレクトリです. テストモジュールまたはすべてのモジュールに従って実行できます. このレイヤーの内容は、すべてのシナリオにも適用できます (適用可能な前提は、po 設計モードのディレクトリ構造が上記のように)

テストレポート:

 1 import time
 2 # 时间
 3 import unittest
 4 # 加载测试模块
 5 import os
 6 # 处理路径
 7 import HTMLTestRunner
 8 # 生成测试报告必须要用的库
 9 def getSuite():
10     # start_dir=加载所有的测试模块来执行,pattern=通过正则的模式加载所有的模块
11     '''获取所有执行的测试模块'''
12     suite = unittest.TestLoader().discover(
13         start_dir=os.path.dirname(__file__),
14         pattern='test_*.py'
15     )
16     return suite
17 
18 # 获取当前时间
19 def getNowtime():
20     return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time()))
21 
22 # 执行获取的测试模块,并获取测试报告
23 def main():
24     filename=os.path.join(os.path.dirname(__file__),'report',getNowtime()+"report.html")
25     # 把测试报告写入文件中,b是以二进制的方式写入
26     fp=open(filename,"wb")
27     # HTMLTestRunner实例化的过程,stream是流式写入,title是测试报告的标题,description是对测试报告的描述
28     runner=HTMLTestRunner.HTMLTestRunner(
29         stream=fp,
30         title="UI自动化测试报告",
31         description="UI自动化测试报告"
32     )
33     runner.run(getSuite())
34 if __name__=="__main__":
35     main()

報告:

主にテストレポートの保存に使用

エピローグ

この投稿はここで終わります。最後に、この投稿を読んだ友人が何かを得られることを願っています。

 POモードチュートリアルの入手方法:[下の小さなカード]をクリック

記事が悪くないと思われる場合は、 いいね、シェア、メッセージを残してください 。

おすすめ

転載: blog.csdn.net/2201_76100073/article/details/130487189