我想在python中运行单元测试,其中一些需要简单的Mongo容器,在其中插入数据。
这是我实际的操作方式:
jobs:
- job: BuildMongoComponent
displayName: Build Mongo Container
steps:
- script: |
# --publish-all because I need a random port
MONGO_ID=$(docker run --publish-all -d --mount type=bind,source=${PWD}/mongo_mock_data,target=/tmp/mongo_mock_data mongo)
MONGO_PORT=$( docker inspect $MONGO_ID | jq -r '.[0].NetworkSettings.Ports."27017/tcp"[0].HostPort' )
docker exec $MONGO_ID mongoimport --db algo --collection train --type json --file /tmp/mongo_mock_data/train_data.json
docker exec $MONGO_ID mongoimport --db algo --collection calculation --type json --file /tmp/mongo_mock_data/predict_data.json --jsonArray
docker exec $MONGO_ID mongoimport --db pulse_algo --collection cluster --type json --file /tmp/mongo_mock_data/cluster_data.json
env:
# this value will be lost in the next job. However, I need this value in my Python tests.
MONGODB_URL: 'mongodb://localhost:${MONGO_PORT}'
- job: Unittests
displayName: Unit tests
container: 'python:3.6'
steps:
- script: |
python -m pip install -r requirements.txt
displayName: 'Install requirements'
env:
PIP_INDEX_URL: $(PIP_INDEX_URL)
- script: |
python -m pip install -r requirements.dev.txt
python -m pytest
displayName: 'Unit tests'
env:
PIP_INDEX_URL: $(PIP_INDEX_URL)
但是,由于我无法在此工作之外访问env变量MONGODB_URL,因此无法使用。我什至不确定我在Python作业Unittests时是否可以访问Mongo容器。
我的问题:我该怎么办 -用随机端口构建一个Mongo容器,并在其中插入数据,然后 -运行我的python测试并从我的Python容器访问Mongo容器中的数据?
答案 0 :(得分:1)
作为设计,每个座席工作都是一个独立的过程。因此,您正面临预期的行动。
在没有mongo容器的情况下,您的问题可以简单地理解为如何在BuildMongoComponent
作业中获取和访问Unittests
作业的变量。
由于您使用的是YAML管道,因此您可以在此处首先将MONGODB_URL
设置为输出变量。然后使Unittests
工作depends on BuildMongoComponent
工作。
示例:
在脚本上进行了简单修改:
jobs:
- job: BuildMongoComponent
displayName: Build Mongo Container
steps:
- script: |
# --publish-all because I need a random port
MONGO_ID=$(docker run --publish-all -d --mount type=bind,source=${PWD}/mongo_mock_data,target=/tmp/mongo_mock_data mongo)
MONGO_PORT=$( docker inspect $MONGO_ID | jq -r '.[0].NetworkSettings.Ports."27017/tcp"[0].HostPort' )
docker exec $MONGO_ID mongoimport --db algo --collection train --type json --file /tmp/mongo_mock_data/train_data.json
docker exec $MONGO_ID mongoimport --db algo --collection calculation --type json --file /tmp/mongo_mock_data/predict_data.json --jsonArray
docker exec $MONGO_ID mongoimport --db pulse_algo --collection cluster --type json --file /tmp/mongo_mock_data/cluster_data.json
echo "##vso[task.setvariable variable=PORT;isOutput=true]mongodb://localhost:$MONGO_PORT"
name: Mongo
- job: Unittests
displayName: Unit tests
container: 'python:3.6'
dependsOn: BuildMongoComponent
variables:
NewPort: $[dependencies.BuildMongoComponent.outputs['Mongo.PORT']]
steps:
- script: |
python -m pip install -r requirements.txt
displayName: 'Install requirements'
env:
PIP_INDEX_URL: $(PIP_INDEX_URL)
目前,您可以使用MONGODB_URL
访问 Unittests 作业中的$(NewPort)
值。
脚本的另一个问题: 由于您没有提及,因此不确定如何存储您的PWD值。如果将其存储为秘密变量,恐怕您使用的格式不正确。您应该使用$(PWD)来获取其值。