Unit testing 进行需要输入文件的distcheck和测试

Unit testing 进行需要输入文件的distcheck和测试,unit-testing,automake,Unit Testing,Automake,我最近将我的构建系统转换为automake/autoconf。在我的项目中,我有一些单元测试需要在运行它们的目录中输入一些数据文件。当我运行makedistcheck并尝试VPATH构建时,这些测试失败,因为它们显然不是从输入文件所在的目录运行的。我想知道是否有一些快速修复方法。例如,我是否可以告诉系统不要在makedistcheck上运行这些测试(但仍然在makecheck上运行它们)?或者在运行测试之前将文件刻录到文件所在的目录?典型的解决方案是编写测试,以便它们在源目录中查找数据文件。例如

我最近将我的构建系统转换为automake/autoconf。在我的项目中,我有一些单元测试需要在运行它们的目录中输入一些数据文件。当我运行makedistcheck并尝试VPATH构建时,这些测试失败,因为它们显然不是从输入文件所在的目录运行的。我想知道是否有一些快速修复方法。例如,我是否可以告诉系统不要在makedistcheck上运行这些测试(但仍然在makecheck上运行它们)?或者在运行测试之前将文件刻录到文件所在的目录?

典型的解决方案是编写测试,以便它们在源目录中查找数据文件。例如,您可以在测试中引用
$srcdir
,或者将
test
转换为
test.in
并参考
@srcdir@

如果您的测试都在源目录中,则可以通过在Makefile.am中设置tests\u ENVIRONMENT来运行该目录中的所有测试:

TESTS_ENVIRONMENT = cd $(srcdir) &&
如果您的某些测试是由configure创建的,因此只存在于build目录中,则此操作将失败,在这种情况下,您可以选择使用类似以下内容的cd:

 TESTS_ENVIRONMENT = { test $${tst} = mytest && cd $(srcdir); true; } &&

试图在这样的环境中使用测试充其量是脆弱的,最好是编写测试,以便它们在源目录中查找数据文件。

我遇到了同样的问题,并使用了类似于William的解决方案。My Makefile.am的外观如下所示:

EXTRA_DIST = testdata/test1.dat

AM_CPPFLAGS = -DDATADIR=\"$(srcdir)/\"
然后,在我的单元测试中,我使用DATADIR定义:

string path = DATADIR "/testdata/test1.dat"

这适用于
make check
make distcheck

我的测试在src/some/path中,数据文件在同一目录中。我已经尝试了TESTS_ENVIRONMENT=cd$(srcdir)&&trick,但它没有起作用,因为现在它再也找不到测试可执行文件了。将所需的数据文件复制到当前目录也不起作用,因为在VPATH生成中,您显然没有对运行测试的目录的写入权限。@Martin,您没有对源目录的写入权限,但是您有对生成目录的写入权限。你是如何复制文件的?只需将
EXTRA_DIST=datafile
添加到Makefile.am和
cp${srcdir}/datafile中。
在test.in中就可以了。但是,如果测试是从源目录运行的,则由于写入权限,尝试复制将失败。我怀疑有些测试是从build目录运行的,有些是从source目录运行的。(名为
*.in
的测试(可能)从build dir运行,而其他测试则从source dir运行。)这看起来与我所寻找的完全一样,但这似乎不适用于Automake 1.15,不幸的是:使用它,它会在源目录中创建
*.log
*.trs
文件(这已经很糟糕),但是仍然在build目录中查找它们,当然,在那里找不到它们(这是致命的)。