如何让Travis-CI在测试时识别并打开外部文件

3 投票
2 回答
1896 浏览
提问于 2025-04-17 22:08

最近几次构建失败的项目在我电脑上运行得很好,但在travis上却遇到了问题。问题出在测试中的几行代码(以及其他类似的操作):https://github.com/garth5689/pyd2l/blob/master/test/pyd2l_test.py#L15-L20

在我的测试中,由于需要测试的数据比较复杂,我把这些数据进行了“腌制”(也就是把数据保存成一种格式,方便以后再用),这样就不用每次测试时都去访问我抓取的网站多次了。(欢迎讨论这种测试策略的优缺点,但这不是问题的重点。)

class PyD2LMethodsTest(unittest.TestCase):

    def setUp(self):
        with open('./soup_1899_pickle.pkl', 'rb') as soup_pickle: 
            self.soup = pickle.load(soup_pickle)
        with open('./soup_1899_details_pickle.pkl', 'rb') as details_pickle: 
            self.test_details = pickle.load(details_pickle)
        with open('./test_Match_1899_pickle.pkl', 'rb') as test_Match_pickle: 
            self.test_match = pickle.load(test_Match_pickle)

这导致我的travis构建出现了一系列错误:

======================================================================
ERROR: test_calculate_reward_rounded_ceil (pyd2l_test.MatchTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/build/garth5689/pyd2l/test/pyd2l_test.py", line 70, in setUp
    with open('./test_Match_1899_pickle.pkl', 'rb') as test_Match_pickle: self.test_= pickle.load(
FileNotFoundError: [Errno 2] No such file or directory: './test_Match_1899_pickle.pkl'

这是目录结构:

pyd2l (repo)
|-- pyd2l
|   |-- (actual source files) 
|
+-- test
    |-- pyd2l_test.py   
    |-- soup_1899_details_pickle.pkl
    |-- soup_1899_pickle.pkl
    |-- soup_404_pickle.pkl
    +-- test_Match_1899_pickle.pkl

所有测试在我本地机器上都能正常运行。(我在测试时给文件名加上了./,想看看能否在自己电脑上搞定。我觉得可能是环境变量的问题,但不太确定。也有可能travis不允许“腌制”和“解腌制”,但我没有找到相关的信息。任何帮助都很感激。

Travis构建链接:https://travis-ci.org/garth5689/pyd2l/builds

2 个回答

2

我也遇到过同样的问题,在Mac系统上运行测试一切正常,但在travis CI或ubuntu上运行测试时却出现了FileNotFoundError错误。Travis CI使用的是ubuntu系统。假设你的文件夹结构是这样的:

project_folder:
|
+---file1.py
+---output_folder
    |
    +---output.txt

如果你的'file1.py'里面有一个open()函数,它应该是用来创建输出文件夹和'output.txt'文件的,那么在ubuntu系统上运行测试时,它会期待你已经在系统里或者在你的github仓库里有'output_folder'这个文件夹。'output.txt'文件可以不在,但这个文件夹必须存在。所以如果你把这个文件夹添加到了.gitignore文件里,你可能需要把它移除。希望这能帮到你。

6

./ 是多余的;因为文件的路径已经是相对于你当前的工作目录了。

问题在于,你希望它是相对于你的测试目录的,所以:

import os
# ...

with open(os.path.join(os.path.dirname(__file__), 'soup_1899_pickle.pkl'), 'rb') as soup_pickle:

撰写回答