アイデア:
1. 基本的なディレクトリ構築
レポート: 静的出力ディレクトリ (レポートまたはログ)
データ: 静的入力ディレクトリ (Excel データ、読み取られる一部のデータを保存可能)
utils: ユーティリティ メソッド レイヤー (ここに保存されるのはプロジェクトのパブリック メソッドです。一般に、Excel でのデータの読み取り、データベースへの接続など、他のプロジェクトを取得するときにこれを直接使用できます。 apis
: インターフェイス リクエスト レイヤー (ここでカプセル化されているメソッドは、通常、次のようなプロジェクトに関連しています: send post request 、取得リクエストの送信、ログイン インターフェイス、登録インターフェイス、支払いインターフェイス、ショッピング カート インターフェイスの追加)
テストケース: ユース ケース ディレクトリ(プロジェクトに関係するユース ケースを保存するために使用されます。ユース ケースには、単一のインターフェイスのユース ケースと関連するインターフェイスのユース ケースが含まれます)。ディレクトリの管理、ディレクトリ階層を通じて管理することもできます)
conftest: フィクスチャはここに保存され、ファイルが配置されているディレクトリに対してのみ有効になります。単一ディレクトリのみの使用例の場合は、ルート ディレクトリが階層ディレクトリ構造のユース ケースに分割されている場合、
現在のディレクトリのユース ケースに合わせて、このディレクトリに conftest を作成して、pytest フレームワーク pytest.ini のルートであるフィクスチャを保存できます。 pytest の構成ファイルで
、-v - s などの実行構成項目を保存したり、ログ出力チャネルを構成したりするために使用できます。このファイル
の具体的な構成は
.ini---"テストケース
②上記はピラミッド構造に相当し、左から右へ下から上への過程です。
③ピラミッドの本質は、例えば(上部は下部に依存し、下部は上部に依存しない)です。 (テストケース内のユースケースはディレクトリ内の apis インターフェイスリクエストメソッドを呼び出す必要があり、apis はテストケースを積極的に呼び出しません) そのため、仕事中に特定のファイルを変更した場合、誰がこのファイルを呼び出したかを調べる必要があります
。それに応じて変更します
##########################utils中的db.py的封装
import pymysql
#
# # 1. 连接数据库
# conn = pymysql.connect(
# host='服务器地址',
# port=3306,
# user='用户名',
# password='密码',
# db='数据库名'
# )
# # 2. 建立游标
# cur = conn.cursor(pymysql.cursors.DictCursor) # 没有s 有括号
#
# # 3. 执行sql
# # 3.1 执行查询
# cur.execute("SELECT * FROM cardInfo WHERE cardNumber='hzc_00011';")
# conn.commit()
# # 获取结果
# result = cur.fetchall()
# # result = cur.fetchone() # 取一条少一条
# # cur.fetchmany(3)
# print(result)
#
# # 3.2 执行修改
# # cur.execute("DELETE FROM cardInfo WHERE cardNumber='hzc_00011';")
# # conn.commit()
#
# # 4. 关闭
# cur.close()
# conn.close()
class DB(object):
def __init__(self):
self.conn = pymysql.connect(
host='服务器地址',
port=3306,
user='用户名',
password='密码',
db='数据库名',
autocommit=True
)
self.cur = self.conn.cursor(pymysql.cursors.DictCursor) #添加此配置项,默认commit了,即建立游标
def do_sql(self, sql):
print('执行sql', sql)
self.cur.execute(sql) #执行sql语句
# self.conn.commit()
return self.cur.fetchall() #返回查询到的所有结果
class FuelCardDB(DB): #继承DB
"""执行具体的sql语句"""
def del_card(self, card_number):
"""执行删除语句"""
self.do_sql(f"DELETE FROM cardInfo WHERE cardNumber='{card_number}'")
def check_card(self, card_number):
"""执行查询语句"""
result = self.do_sql(f"SELECT * FROM cardInfo WHERE cardNumber='{card_number}';")
if result:
return True
return False
def add_card(self, card_number):
"""执行添加语句"""
result = self.check_card(card_number)
if not result:
self.do_sql(f"INSERT INTO cardInfo (cardNumber) VALUES ('{card_number}');")
######################### API ファイルのカプセル化
アイデア: このファイルは、さまざまなリクエスト メソッドとさまざまなリクエスト アドレス インターフェイスをクラスにカプセル化し、ユース ケース レイヤーで使用されるものを呼び出すことができます。次の例は、燃料カード アイテムを追加することです
。
import requests
DATA_SOURCE_ID = "bHRz"
class Api(object):
def __init__(self, base_url):
self.url = base_url + '/gasStation/process'
self.session = requests.session()
def add_fuelcard(self, card_number):
json_data = {"dataSourceId": DATA_SOURCE_ID, "methodId": "00A", "CardInfo": {"cardNumber": card_number}}
res = self.session.post(self.url, json=json_data)
print(res.text)
return res
def bind_card(self, user_name, id_type, id_number, card_number):
json_data = {
"dataSourceId": DATA_SOURCE_ID,
"methodId": "01A",
"CardUser": {
"userName": user_name,
"idType": id_type,
"idNumber": id_number
},
"CardInfo": {
"cardNumber": card_number
}
}
res = self.session.post(self.url, json=json_data)
print(res.text)
return res
def query_card(self, user_id, card_number):
#dataSourceId=bHRjczEx&userId=1039&cardNumber=1111111111&methodId=02A
params = {
"dataSourceId": DATA_SOURCE_ID,
"methodId": "02A",
"userId": user_id,
"cardNumber": card_number
}
res = self.session.get(self.url, params=params)
print(res.text)
return res
アイデア: このファイルは主にフィクスチャ メソッドをカプセル化しています。つまり、ユース ケース レイヤーのステップを簡略化するために、操作の前提条件ステップとプロセス ステップをこのファイルの下で完了できます。このファイルの下には、base_url があります。インストールされたプラグイン。インストール方法は
pip install pytest-base-url です。
import pytest
from utils.db import FuelCardDB
from apis.fuelcard_api import Api
@pytest.fixture(scope='session')
def db():
#实例化一个对象
return FuelCardDB()
@pytest.fixture(scope='session')
def api(base_url):
#实例化一个对象,并将配置文件中的base_url传给Api层的方法
return Api(base_url)
@pytest.fixture
def del_card(db):
def _del_card(card_number):
db.del_card(card_number)
yield
db.del_card(card_number)
return _del_card
########################pytest.ini ファイルのカプセル化
考察: 上で説明したように、このファイルは pytest フレームワークの設定ファイルです。つまり、ユースケースを実行するときにデフォルトでファイル操作が実行されます。表現形式に注意してください。conftest ファイルと conftest ファイルの両方で、base_url が使用されます。 api ファイル(ここではbase_url)であり、目的はサーバーとして機能することです
。アドレスが変更された後、インターフェイス層に移動してサーバーアドレスを1つずつ変更する必要はありません。ここでアドレスを変更するだけです。ただし、
インターフェイスのリクエスト アドレスが変更されると、それを 1 つずつ変更する必要があり、結局のところ、異なるリクエストに対して異なるリクエスト アドレスがカプセル化されます。
[pytest] addopts = -s --html=reports/report.html --self-contained-html testpaths = testcasesbase_url = http://***.***.***.***:** *
#####################要約
①インターフェイスの主要な枠組みはほぼ出来上がっているので、その他のメソッドが必要な場合は適宜追加することができます(例:Excelのテーブルデータを読み込むメソッドはutilsディレクトリにパッケージ化できます)
②公開メソッドが必要な場合は、Baidu にアクセスして他の人が書いたモジュールを確認することができます。正直に言って、自分で長い間書くのは、他の人がパッケージしたメソッドほど実用的ではありません。私たちの目標は、他の人がパッケージしたメソッドを使用することです。それで大丈夫です。
③独自のビジネスモジュールが含まれる場合は、自分でパッケージ化する必要があります。たとえば、前述したように、API ファイルと conftest ファイルはすべてビジネスに関連します。
④ ジュニア自動テスターにとって最も重要なことは、フレームワークを書くことではなく、他の人が書いたフレームワークを使用してユースケースを設計および作成することです
⑤ユースケースの基本プロセス:テスト環境の準備、テストデータの準備、データの送信、データ応答結果の取得、アサーションの設定、環境のクリーンアップ