Python FAILED AssertionError with GitHub Actions CI / CD Pip



我正在尝试一步一步地复制本视频"云简历挑战冲刺(2022年9月)-第4周">来自youtube, https://youtu.be/wiyI0Ngn31o,关于如何使用CD/CI管道设置GitHub Actions,以便在AWS中使用Python对SAM部署进行后端测试。我使用的是YouTube视频的GitHub repo的修改文件:https://github.com/CumulusCycles/CloudResumeChallenge/tree/main/Week_4

我已经按照视频的说明一步一步地做了;然而,当我推送邮件时。我从GitHub Actions中得到以下错误消息:

Run pytest
============================= test session starts ==============================
platform linux -- Python 3.8.15, pytest-7.2.0, pluggy-1.0.0
rootdir: /home/runner/work/cloud-resume-challenge/cloud-resume-challenge
plugins: mock-3.10.0
collected 1 item
serverless-architecture-with-SAM/tests/test_handler.py F                 [100%]
=================================== FAILURES ===================================
_____________________________ test_lambda_handler ______________________________
@mock.patch.dict(os.environ, {"TABLENAME": TABLENAME})
def test_lambda_handler():
# Check AWS creds
assert "AWS_ACCESS_KEY_ID" in os.environ
assert "AWS_SECRET_ACCESS_KEY" in os.environ

ret = app.lambda_handler("", "")

# Assert return keys
assert "statusCode" in ret
assert "headers" in ret
assert "body" in ret

# Check for CORS in Headers
assert "Access-Control-Allow-Origin"  in ret["headers"]
assert "Access-Control-Allow-Methods" in ret["headers"]
assert "Access-Control-Allow-Headers" in ret["headers"]

# Check status code
if ret["statusCode"] == 200:
>           assert "visit_count" in ret["body"]
E           AssertionError: assert 'visit_count' in '39'
serverless-architecture-with-SAM/tests/test_handler.py:34: AssertionError
=========================== short test summary info ============================
FAILED serverless-architecture-with-SAM/tests/test_handler.py::test_lambda_handler - AssertionError: assert 'visit_count' in '39'
============================== 1 failed in 0.53s ===============================
Error: Process completed with exit code 1.

下面是我的test_handler.py的内容在错误中引用的文件:

import os
import re
import json
from unittest import mock
from hello_world import app
#os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'
with open('serverless-architecture-with-SAM/template.yaml', 'r') as f:
TABLENAME = re.search(r'TableName: (.*)?', f.read()).group(1)
@mock.patch.dict(os.environ, {"TABLENAME": TABLENAME})
def test_lambda_handler():
# Check AWS creds
assert "AWS_ACCESS_KEY_ID" in os.environ
assert "AWS_SECRET_ACCESS_KEY" in os.environ
ret = app.lambda_handler("", "")
# Assert return keys
assert "statusCode" in ret
assert "headers" in ret
assert "body" in ret
# Check for CORS in Headers
assert "Access-Control-Allow-Origin"  in ret["headers"]
assert "Access-Control-Allow-Methods" in ret["headers"]
assert "Access-Control-Allow-Headers" in ret["headers"]
# Check status code
if ret["statusCode"] == 200:
assert "visit_count" in ret["body"]
assert json.loads(ret["body"])["visit_count"].isnumeric()
else:
assert json.loads(ret["body"])["visit_count"] == -1
return

和我的app.py的内容文件:

import json
import boto3
dynamodb = boto3.resource('dynamodb', region_name="us-east-1")
table = dynamodb.Table('resume-website-app-tbl')
def lambda_handler(event, context):
response = table.get_item(
Key = {
'ID':'visits'
}
)

visit_count = response['Item']['counter'] 
visit_count = str(int(visit_count) + 1)

response = table.put_item(
Item = {
'ID':'visits',
'counter': visit_count
}
)
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': '*',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*'
},
'body': visit_count
}

这是我的main.yml的副本文件:

name: main
on: push

jobs:
test-infra:
runs-on: ubuntu-latest
timeout-minutes: 2
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v3
with:
python-version: 3.8
- name: Install dependencies
run: |
cd serverless-architecture-with-SAM/tests
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests with pytest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-1
run: pytest
build-and-deploy-infra:
needs: test-infra
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: aws-actions/setup-sam@v1
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- run: sam build
working-directory: serverless-architecture-with-SAM
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
working-directory: serverless-architecture-with-SAM
deploy-site:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: jakejarvis/s3-sync-action@master
with:
args: --delete
env:
AWS_S3_BUCKET: justinhenson-cloud-resume-website
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
SOURCE_DIR: serverless-architecture-with-SAM/resume-site

我完全不知道为什么断言失败了。如有任何帮助,不胜感激。

assert "visit_count" in ret["body"]

你断言你的身体有一个名为"visit_count"的键,但是

'body': visit_count

你的实际身体只是一个普通的整数。你是指

之类的东西吗?
'body': {
'visit_count' : visit_count
}

?

最新更新