所以我一直想在我的测试中集成代码覆盖率,为此我使用了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的原因。
我现在将等待,因为我真的不能做任何其他事情。我会更新这个问题时,我知道它是否真的是一个错误或没有。
1条答案
按热度按时间pw9qyyiw1#
运行container时需要装入卷: