Python覆盖率在Docker外部保存文件,但不在内部保存

k75qkfdt  于 2023-03-17  发布在  Docker
关注(0)|答案(1)|浏览(111)

所以我一直想在我的测试中集成代码覆盖率,为此我使用了coverage api
我有一个退出处理程序,它在SIGINT、SIGTERM和SIGABRT信号上触发:

import logging
import signal

import config

logger = logging.getLogger(__name__)

class Exit:
    def __init__(self, cov):
        self.cov = cov
        signal.signal(signal.SIGTERM, self.exit_cleanly)
        signal.signal(signal.SIGINT, self.exit_cleanly)
        signal.signal(signal.SIGABRT, self.exit_cleanly)

    def exit_cleanly(self, signal_number, stackframe):
        logger.info("Received exit signal. Exiting...")
        if config.coverage:
            logger.info("Saving coverage files")

            try:
                self.cov.stop()
                self.cov.save()
                logger.info("Successfully saved coverage")
            except Exception as e:
                logger.critical("Exception occurred while saving coverage:")
                logger.critical(e)

        quit(0)

这是我在主程序顶部所做的:

if config.coverage:
    from coverage import Coverage
    coveragedatafile = ".coverage-" + str(int(time()))
    cov = Coverage(data_file=f"{config.datadir_server}/coverage/{coveragedatafile}")
    cov.start()
else:
    cov = ""

exit_handler = Exit(cov)

在docker外运行时一切都很好,但在docker内运行时,它会停止而不保存我的文件。我添加了一个卷,当使用open()时,我也可以写入一个文件,它会出现在文件夹中。
现在我来编辑这个问题的原因。在我更新这个问题之前,日志说它将要更新,然后就停止了。但是现在它甚至说它成功地保存了文件。但是它们无处可寻。
退出时日志里是这么写的。

matrix-notifier-tester exited with code 0
matrix-notifier-bot | 03-10 14:40 Received exit signal. Exiting...
matrix-notifier-bot | 03-10 14:40 Successfully saved
matrix-notifier-bot exited with code 0
matrix-notifier-server exited with code 0

这是我的docker-compose:

version: "3.3"

services:
  server:
    container_name: "matrix-notifier-server"
    build:
      context: ../server
      dockerfile: Dockerfile
    ports:
    - "5505:5505"
    env_file:
    - .test-env
    volumes:
      - ./data:/data

  bot:
    container_name: "matrix-notifier-bot"
    build:
      context: ../bot
      dockerfile: Dockerfile
    depends_on:
      - server
    env_file:
    - .test-env
    volumes:
      - ./data:/data

  tester:
    container_name: "matrix-notifier-tester"
    build:
      context: ../tests
      dockerfile: Dockerfile
    depends_on:
      - server
      - bot
    env_file:
    - .test-env
    volumes:
      - ./data:/data

一开始我以为这与我使用--abort-on-container-exit有关,但是我试着在没有--abort-on-container-exit的情况下运行它,似乎没有什么变化
我花了很长时间寻找有类似问题的人,但没有找到。

编辑2:

已经一天了,我还是不明白。
我曾想过,也许覆盖率模块要么没有写的权限,出于某种原因没有吐出一个错误,要么出于某种原因不知道正确的路径在哪里,但事实并非如此。
coverage文件夹是在coverage模块启动时创建的,因此这意味着它必须具有访问权限并知道要保存到的正确路径。
这似乎是一个非常奇怪的问题。

编辑3:

既然没有人回答我的问题,我也不知道是什么原因导致coverage API不保存文件,我只能相信这是coverage api的一个bug,这也是我决定打开一个issue on the coverage.py github的原因。
我现在将等待,因为我真的不能做任何其他事情。我会更新这个问题时,我知道它是否真的是一个错误或没有。

pw9qyyiw

pw9qyyiw1#

运行container时需要装入卷:

docker run -v /path/to/host/directory:/path/to/container/directory your-image

相关问题