如何让Travis-CI在测试时识别并打开外部文件
最近几次构建失败的项目在我电脑上运行得很好,但在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 个回答
我也遇到过同样的问题,在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文件里,你可能需要把它移除。希望这能帮到你。
./
是多余的;因为文件的路径已经是相对于你当前的工作目录了。
问题在于,你希望它是相对于你的测试目录的,所以:
import os
# ...
with open(os.path.join(os.path.dirname(__file__), 'soup_1899_pickle.pkl'), 'rb') as soup_pickle: