ネットワーク全体で最高の Python インターフェース自動化テスト - インターフェース署名 (戦闘コード)


序文

一般に、企業の外部インターフェイスは署名署名を使用して顧客ごとに異なる apikey を提供します。これにより、インターフェイス リクエストのセキュリティが向上し、キャプチャ後にリクエスト パラメータを変更することでランダムなリクエストを回避できます。

インターフェース署名の署名

ログイン インターフェイス リクエストを例に挙げると、次のインターフェイスはパケット情報をキャプチャし、署名の署名ルールは次のとおりです。

最初のステップでは、文字列を連結し、最初にsignパラメータ自体を削除し、次に値が空のパラメータp3を削除してp2=v2&p1=v1&method=cancel&pn=vnを残し、パラメータ名の文字の昇順でソートします。 Method=cancel&p1=v1&p2=v2&
pn =vn.
2 番目のステップは、パラメーターの名前と値を連結し、最後に Methodcancelp1v1p2v2pnvn を取得することです。 3 番目のステップは、
上記の連結された文字列の後に検証キー apikey を追加することです。 abc であると仮定し、新しい文字列を取得します。methodcancelp1v1p2v2pnvnabc.
4 番目のステップでは、結果が abcdef であると仮定して、md5 計算のために文字列を小文字に変換します。この値は、sign の署名値です。

注: md5 を計算する前に、インターフェイスの文字列エンコーディングがアクセス側のエンコーディングと一致していることを確認してください。たとえば、utf-8 エンコーディングまたは GBK エンコーディングが均一に使用されています。エンコーディング方法が矛盾している場合、計算された署名は失敗します。検証します。

POST http://127.0.0.1:8000/api/v3/login HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: 127.0.0.1:8000
Content-Length: 111

{
    
    
	"username": "test",
	"password": "123456",
    "sign": "1aca01806e93bb408041965a817666af"

}

HTTP/1.1 200 OK
Date: Sat, 26 Oct 2019 03:38:31 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Content-Type: application/json
Vary: Accept, Cookie
Allow: POST, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 109

{
    
    "code": 0, "msg": "login success!", "username": "test", "token": "a76ba3b8fcbdff82f6a94e5ad5bf8fb934192e5f"}

署名署名を実装する

conftest.py に pre_sign 関数を記述して、リクエストの本文部分を前処理します。

import hashlib
from pytest_yaml_yoyo import my_builtins


def sign_body(body: dict) -> str:
    """对body 签名"""
    key = "12345678"      # 接口项目的开发提供
    # 去掉sign 和值为空的
    new_body = [''.join(item) for item in body.items() if item[0] != 'sign' and item[1] != '']
    # print(new_body)
    # 做排序
    new_body.sort()
    # 拼接
    # print(new_body)
    str_body = ''.join(new_body) + key
    # print(str_body)
    # md5加密

    def jiamimd5(src: str):
        """md5加密"""
        m = hashlib.md5()
        m.update(src.encode('UTF-8'))
        return m.hexdigest()

    sign = jiamimd5(str_body)
    return sign


def pre_sign(req: dict):
    print(f'请求预处理:{
      
      req}')
    sign = sign_body(req.get('json'))
    req['json']['sign'] = sign
    print(f'处理后的req数据:{
      
      req}')


my_builtins.pre_sign = pre_sign

pre_sign 関数の req パラメーターは、yaml ユースケースの request パラメーターに対応します。これは、データの辞書型です。

test_sign_login.yml ユースケースの内容

config:
  name: 登录
  hooks:
    request: ['pre_sign']

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
  validate:
    - eq: [body.code, 0]

ユースケースを実行する

pytest test_sign_login.yml

実行ログ

test_sign_login.yml::test_login
---------------------------------------------------- live log call -----------------------------------------------------
2023-06-08 09:45:11 [INFO]: 执行文件-> test_sign_login.yml
2023-06-08 09:45:11 [INFO]: base_url-> http://127.0.0.1:8200
2023-06-08 09:45:11 [INFO]: config variables-> {
    
    }
2023-06-08 09:45:11 [INFO]: 运行用例-> test_login
请求预处理:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456'}}
处理后的req数据:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: --------  request info ----------
2023-06-08 09:45:11 [INFO]: yml raw  -->: {
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'passw
ord': '123456', 'sign': '65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: method   -->: POST
2023-06-08 09:45:11 [INFO]: url      -->: /api/v3/login
2023-06-08 09:45:11 [INFO]: headers  -->: {
    
    'User-Agent': 'python-requests/2.30.0', 'Accept-Encoding': 'gzip, deflate', 'A
ccept': '*/*', 'Connection': 'keep-alive'}
2023-06-08 09:45:11 [INFO]: json     -->: {
    
    "username": "test8", "password": "123456", "sign": "65faa7273d552aaedda3abdd1f
e5c865"}
2023-06-08 09:45:11 [INFO]: ------  response info  200 OK ------
2023-06-08 09:45:11 [INFO]: 耗时     <--: 0.207054s
2023-06-08 09:45:11 [INFO]: url      <--: http://127.0.0.1:8200/api/v3/login
2023-06-08 09:45:11 [INFO]: headers  <--: {
    
    'Date': 'Thu, 08 Jun 2023 01:45:11 GMT', 'Server': 'WSGIServer/0.2 CPython/3.6
.8', 'Content-Type': 'application/json', 'Allow': 'POST, OPTIONS', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Length': '11
0', 'Vary': 'Cookie'}
2023-06-08 09:45:11 [INFO]: cookies  <--: {
    
    }
2023-06-08 09:45:11 [INFO]: raw text <--: {
    
    "code": 0, "msg": "login success!", "username": "test8", "token": "045acf05c42
2ad8a40e2309ecb8de830d664e50c"}
2023-06-08 09:45:11 [INFO]: validate 校验内容-> [{
    
    'eq': ['body.code', 0]}]
2023-06-08 09:45:11 [INFO]: validate 校验结果-> eq: [0, 0]
2023-06-08 09:45:11 [INFO]: export 导出全局变量:{
    
    }
PASSED            

実行結果からわかるように、このユースケースではsignパラメータを渡しませんが、フック内のリクエストフックがリクエストパラメータを前処理して、動的署名へのsignパラメータの自動追加を実現しています。

请求预处理:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456'}}
处理后的req数据:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}

ユース ケースでのフック パラメーターの使用
前の例は、config にフック パラメーターを配置することであり、アクションの範囲は、現在の yaml ユース ケース ファイル内の各リクエストに対して前処理関数を自動的に呼び出すことです。

config:
  name: 登录
  hooks:
    request: ['pre_sign']

単一のリクエストのみを前処理する場合は、インターフェイスのリクエスト パラメータにフック パラメータを入れることができます。

config:
  name: 登录

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
    hooks:
      request: ['pre_sign']
  validate:
    - eq: [body.code, 0]

このように、フックのスコープは単一のインターフェース要求のみになります。

以下は、私がまとめた 2023 年の最も完全なソフトウェア テスト エンジニア学習知識アーキテクチャ システム図です。

1. Pythonプログラミングの入門から習得まで

画像の説明を追加してください

2.インターフェース自動化プロジェクトの実戦

画像の説明を追加してください

3. Web自動化プロジェクトの実戦

画像の説明を追加してください

4. アプリ自動化プロジェクトの実戦

画像の説明を追加してください

5. 一流メーカーの再開

画像の説明を追加してください

6. DevOps システムのテストと開発

画像の説明を追加してください

7. 一般的に使用される自動テストツール

画像の説明を追加してください

8、JMeterのパフォーマンステスト

画像の説明を追加してください

9. まとめ(最後にちょっとしたサプライズ)

最善を尽くすことによってのみ、私たちは自分を超え、夢を羽ばたかせることができます。たとえ前途にどんなに荊棘があったとしても、私たちは勇気を持って通り抜け、心の中の星と海を追いかけなければなりません。粘り強さと成功は、果敢に闘う者に与えられるでしょう。

最善を尽くすことによってのみ、私たちは栄光の向こう側に到達することができます。忍耐することによってのみ、私たちは自分自身の奇跡を生み出すことができます。心に夢がある限り、すべての一歩は成功への勇敢な出発点です。自分を信じて戦い続けてください!

あらゆる努力はチャンスであり、あらゆる粘り強さは希望です。失敗を恐れないでください。成功には勇気と決意が必要です。絶えず努力することによってのみ、私たちは明るい未来を迎えることができます。自分を信じてください、あなたならできるよ!

おすすめ

転載: blog.csdn.net/csdnchengxi/article/details/131557743