使用python和mongo容器在azure管道中执行单元测试

时间:2020-03-20 11:15:05

标签: python-3.x mongodb azure-devops azure-pipelines

我想在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容器中的数据?

1 个答案:

答案 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)来获取其值。