所以我一直想在我的测试中集成代码覆盖率,为此我使用 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 内部运行时它会停止而不保存我的文件。
现在我编辑问题的原因来了。使用我更新问题之前的代码,日志说它即将更新,然后就停止了。但是现在竟然说保存成功了。但他们无处可寻。
这就是它在退出日志中所说的内容。
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
起初我认为这与我使用
--abort-on-container-exit
的事实有关,但我尝试在没有它的情况下运行它并且它似乎没有改变任何东西
我花了很多时间寻找有类似问题的人,但找不到。
编辑2:
已经一天了,我还是不明白。
我想也许覆盖模块没有写入权限并且由于某种原因没有吐出错误或者它不知道正确的路径在哪里,但事实并非如此。
覆盖文件夹由覆盖模块在启动时创建,这意味着它必须具有访问权限并知道保存到的正确路径。
这似乎是一个非常奇怪的问题。
编辑3:
所以因为没有人回答我的问题,所以我无法弄清楚是什么导致 coverage api 不保存文件。我相信这是 coverage api 中的一个错误,这就是为什么我决定在 coverage.py github 上打开一个issue.
我现在就等着,因为我真的无能为力。当我知道它是否真的是一个错误时,我会更新这个问题。
运行容器时需要挂载卷:
docker run -v /path/to/host/directory:/path/to/container/directory your-image