UI自動請求システムのフレームワーク統合 (3)

フレームワークディレクトリ:

        common: パブリック メソッド クラスの保存と編集、CSV ファイルの取得、構成ファイル データの取得、ログ ファイル オブジェクトの取得、およびデータ ツールの読み取り

        config: ログ構成ファイル、データファイルのストレージパスなどのいくつかの構成ファイルを保存します。

        データ: テスト データを保存する

        ログ: システム操作ログを保存します

        ページ: ページ操作に基づく基本クラスbase_page.pyと、ページ属性と操作用のlogin_page.pyなどのクラスを格納します。

        レポート: テスト レポートを保存する

        スクリーンショット: テスト スクリーンショットを保存する

        test_case: テスト スクリプトを保存する

        test_run: テスト スクリプトを自動的に実行し、テスト レポートを生成します。

UI自動請求システムのユーザーログイン(1)UI自動請求システムの会員管理(2)については   先ほど紹介しました。

ページの一般的な要素をカプセル化し、base_page.py をカプセル化し、ページにログインする方法 login_page.py

そして、メンバー管理アクション member_manage_page.py を追加します。ユーザーのログインを確認し、メンバー操作を追加するテスト スクリプトを作成し、ログのカプセル化を導入し、データの読み取りをテストし、テスト フレームワークに従ってテスト スクリーンショットとテスト レポートを生成するテスト スクリプトを実行します。

        私の理解では、テスト フレームワークは自動テスト方法の管理とメンテナンスを改善するためのものです。購買、販売、保管システムの Web オートメーションを例に挙げます。まず、ページ ディレクトリから開始し、basePage クラスを作成し、一般的なページ操作をカプセル化します。たとえば、一般的な要素の配置方法、ドロップダウン ボックスの配置方法などです。次に、ページ ディレクトリの下で、ビジネス操作のために、ページは、basePage から継承する必要がある LoginPage へのログインなどの Page クラスに対応します。ログイン LoginPage は、ページ操作を格納するクラスです。

        次に、util ディレクトリを定義し、いくつかのテスト ツールを保存し、myunit クラスを定義し、ページを開くメソッドを定義し、ドライバーを初期化し、ブラウザを閉じることができます。testcases ディレクトリにテスト スクリプト (テスト ログイン用の login_test.py など) を定義し、myunit を継承し、LoginPage をインポートして、そこにテスト データを入力してテストを開始します。

        テストを始めると必ず問題が発生するので、ロギングを統合しており、操作ステップごとに操作ログがあり、問題を見つけるのに便利です。

        テストを行う際、複数のテストデータをテストしたいのですが、テストデータごとにメソッドを記述すると繰り返しのコードが冗長になりデータ管理が不便になるため、データ用のデータディレクトリにテストデータを格納する必要があります。テストと検証の際には、テストのスクリーンショットも必要になります。

        ロギング設定ファイルの読み込み、テストデータの読み込み、スクリーンショットファイルの読み込み、スクリプト格納ディレクトリの読み込みなど、パスを関与させる必要があるため、使用するたびにパスを直接記述すると、これらのパスが分散してしまいます。管理が不便なので、config.yaml を使用して、テストに必要なパス、テスト URL、テスト データベース情報などを保存できます。

        すべての準備が完了したら、すべてのテスト スクリプトを整理し、test_run ディレクトリに実行クラスを作成し、自動テストを実行して、生成されたテスト レポートをレポート ディレクトリに保存します。  

1. Python で yaml ファイルの内容を読み取ります

        一部の構成ファイル、プロジェクト URL、およびデータ駆動型ファイルの変更をプロジェクトに反映しやすくするには、構成ファイルにストレージ アドレスを書き込み、構成ファイルの内容を取得するツール クラスを定義し、対応するファイルを読み取ります。キーワードまたはパスによる値

        config/conf.yaml

loggerConfigPath: ../config/logger.conf  #日志配置文件路径
screenshotpath: ../screenshots/          #截图存放路径
login_url: http://192.168.47.15:8080/woniusales/  #项目url
login_data: ../data/login.csv                     #登录数据csv文件
login_json: ../data/logindata.json                #登录数据json文件路径
case_dir: ../test_cases                           #测试脚本存放路径
report_dir: ../report                             #测试报告存放路径

        Util クラスにはクラス メソッドが定義されており、構成ファイルの内容を読み取り、使用時に Util クラスをインポートし、Util.get_jsondata(Util.get_conf()["keyword"]) を直接呼び出して対応する値を取得します。

common/util.py

import yaml

class Util:

    # 以字典格式返回配置文件的内容
    @classmethod
    def get_conf(cls):
        with open("../config/conf.yaml",'r',encoding='UTF7') as f:
            data = yaml.load(f,Loader=yaml.FullLoader)
            return data
if __name__ == "__main__":
    data = Util.get_jsondata(Util.get_conf()["login_json"])  #获取yaml文件中login_json对应的值
    print(data)

2. Python統合ロギングログ

        プロジェクト運用上で問題が発生した場合、ログ情報は非常に重要であり、問​​題箇所を特定するための重要な手段となるため、ログ内容を出力する際に​​、ログ内容を整形することで問題箇所が分かりやすくなります。別のプロジェクトでは、ログ収集ポイントが多数存在するため、ビジネス属性と組み合わせてログ収集ポイントを設定する必要があります。たとえば、ログイン コードが実行される前に、「ログイン準備完了」のログ情報を挿入できます。

ログ設定ファイル

        config ディレクトリに新しい logger.conf を作成し、次の内容をそこにコピーし、args=('../log/psi.log', 'a') のログ ストレージ パスを保存したいパスに変更します。ログ

        config/logger.conf

[loggers]
keys=root,file,fileAndConsole
[handlers]

keys=fileHandler,consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_file]
level=DEBUG
handlers=fileHandler
qualname=file
propagate=1
[logger_fileAndConsole]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=fileAndConsole
propagate=0
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter
[handler_fileHandler]
class=FileHandler
args=('../log/psi.log', 'a')
level=DEBUG
formatter=simpleFormatter
[formatter_simpleFormatter]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

ログツールクラスのカプセル化:

        common/util.py

import logging.config

filepath = Util.get_conf()["loggerConfigPath"]  #通过工具类获取logger配置文件路径
logging.config.fileConfig(filepath)
logger = logging.getLogger('fileAndConsole')

ログ ファイルの使用:

        ログイン ページ/login_page.py モジュールにロガーをインポートします。問題の特定を容易にするために、ユーザーのログイン開始からユーザーのアカウント番号、パスワード、確認コードの入力まで、操作のすべてのステップを詳細に記録できます。を選択し、ログインボタンをクリックしてログインします。

import time

from selenium.common.exceptions import  TimeoutException
from selenium.webdriver.common.by import By
from common.util import logger,Util

from pages.base_page import BasePage

class LoginPage(BasePage): #定义登录页面的属性和方法

    username = (By.ID,"username")
    password = (By.ID,"password")
    verifycode = (By.ID,"verifycode")
    lgoin_button = (By.XPATH,"//button[contains(@onclick,'doLogin')]")
    flag = (By.XPATH,'//a[contains(text(),"admin")]')

    def user_login(self,us,pw,ve):
        logger.info("=================开始登录================")
        logger.info("输入用户名{}".format(us))
        self.baseFindElement(self.username).send_keys(us)
        logger.info("输入密码{}".format(pw))
        self.baseFindElement(self.password).send_keys(pw)
        logger.info("输入验证码{}".format(ve))
        self.baseFindElement(self.verifycode).send_keys(ve)
        logger.info("==============点击登录按钮================")
        self.baseFindElement(self.lgoin_button).click()
        logger.info("================登录成功==================")

3. スクリーンショットをプロジェクトに追加します

ユーティリティ クラス common/util.py にスクリーンショット メソッドを追加します。

    #添加截图
    @classmethod
    def get_screenshot(cls,driver,path):
        driver.get_screenshot_as_file(path)

ページ操作を行うときに呼び出されます

  Util.get_screenshot(self.driver,Util.get_conf()["screenshotpath"]+now+".png")

4. 自動化されたテストケースを実行する

       すべてのテスト スクリプトを作成した後は、当然のことながら、これらすべてのテスト スクリプトを実行するためのエントリが必要になります。

        conf.yaml 構成ファイルでテスト スクリプトとテスト レポートの場所を定義します。unittest.TestLoader().discover (ファイル パス、一致するファイル形式) はテスト スクリプトを検索し、テスト スクリプトを実行し、HTMLTestRunner を使用してテスト レポートを生成します。 。

            test_run/run.py

import unittest,time
from HTMLTestRunner_cn import HTMLTestRunner
from common.util import Util

test_dir = Util.get_conf()["case_dir"]  #读取测试脚本的目录
report_dir = Util.get_conf()["report_dir"]  #读取测试报告目录
dis = unittest.TestLoader().discover(test_dir,"*_test.py")  #查找测试脚本下以_test结尾python文件
now = time.strftime("%Y-%m-%d %H %M %S")
report_name = report_dir + '/'+now+'test_report.html'
runner = HTMLTestRunner(
    title="进销存系统的自动化测试报告",
    description="v1.0测试结果",
    stream=open(report_name,'wb'),
    verbosity=2
)
runner.run(dis)

5. CSV ファイルを使用してテスト データを保存する

データ/ログイン.csv

管理者、管理者123,0000
管理者、0000
管理者、管理者123、

Utilツールクラスでlogin.CSVファイルを読み取る
    #读取数据
    @classmethod
    def get_testdata_by_row(cls,csv_file,line): #csv_file文件名称 line行数
        logger.info("开始读取数据")
        with open(csv_file,'r',encoding="utf-8") as f:
            reader = csv.reader(f)
            for index,row in enumerate(reader,1):
                if index == line:
                    return row #返回该行数据

読み取ったテスト データをテスト スクリプト test_cases/login_test.py で使用します。

    def test_login_succcess(self):
        lp = LoginPage(self.driver)
        data = Util.get_testdata_by_row(Util.get_conf()["login_data"],1)
        lp.user_login(data[0],data[1],data[2])
        self.assertTrue(lp.check_login())


    def test_login_failed_without_username(self):
        lp = LoginPage(self.driver)
        data = Util.get_testdata_by_row(Util.get_conf()["login_data"], 2)
        lp.user_login(data[0],data[1],data[2])
        self.assertFalse(lp.check_login())

6. データドリブン

        このセクションでは主に、データ ドライバーとしてパラメーター化されたものを使用する方法を紹介します。ログイン ページを例として、ユーザー名、パスワード、確認コード、ログインの有無の 4 つのデータ セットを保存するための logindata.json ファイルをデータ ディレクトリに作成します。成功です。

データ/ログインデータ.json

[
  {
    "username": "admin",
    "password": "admin123",
    "verify": "0000",
    "flag": true
  },
    {
    "username": "",
    "password": "admin123",
    "verify": "0000",
    "flag": false
  },
    {
    "username": "admin",
    "password": "",
    "verify": "0000",
    "flag": false
  },
  {
    "username": "admin123",
    "password": "admin123",
    "verify": "0000",
    "flag": false
  }
]

Util ツール クラスで JSON ファイルを読み取ります。 @parameterized.expand(data) に格納されているデータは [(), (), ()] リストのネストされたタプルであるため、ここでは値を取り出した後、要素を使用します。グループの形式はリスト list_data に存在します

    @classmethod
    def get_jsondata(cls,jsonname):
        with open(jsonname,"r") as  f:
            datas = json.load(f)
            list_data = []
            for data in datas:
                username = data["username"]
                password = data["password"]
                verify = data["verify"]
                flag = data["flag"]
                list_data.append((username,password,verify,flag))
            return list_data

test_cases/login_test.py 内

        ここでは、データ駆動型メソッドの前に @parameterized.expand(data) を追加します。メソッドの上のパラメータは、data で毎回読み取られる値に対応します。フラグが True の場合、このセットのテストを意味しますデータが正しい場合、テストデータに対しては lp.check_login() の戻り値が True であるかどうかをアサートし、それ以外の場合には lp.check_login() の戻り値が False であるかどうかをアサートします。

from common.util import Util
from pages.login_page import LoginPage
from common.myunit import MyUnit
from parameterized import parameterized
import unittest

class LoginTest(MyUnit):

    data = Util.get_jsondata(Util.get_conf()["login_json"])
    @parameterized.expand(data)
    def test_login_param(self,un,pw,ver,flag):
        lp = LoginPage(self.driver)
        lp.user_login(un,pw, ver)
        if flag:
            self.assertTrue(lp.check_login())
        else:
            self.assertFalse(lp.check_login())

おすすめ

転載: blog.csdn.net/xiatian22/article/details/129925257