如果 Python 可用,则选择性地启用测试程序 - automake

Posted

技术标签:

【中文标题】如果 Python 可用,则选择性地启用测试程序 - automake【英文标题】:selectively enabling a test program if Python is available - automake 【发布时间】:2011-07-29 20:39:15 【问题描述】:

我有一个用 C 语言编写的程序,使用 automake/autoconf 构建,并且有两个测试套件。一个是同样用 C 编写的单元测试套件;另一个是端到端的,并且(当前)用 Python 编写。我希望“make check”始终运行单元测试,并且只有在安装了 Python 时才进行端到端测试。这就是我现在拥有的:

TESTS = unittests
if HAVE_PYTHON
TESTS += tester.py
tester_py_SOURCES = src/test/tester.py.in

tester.py: src/test/tester.py.in Makefile
        $(SED) -e 's,[@]PYTHON[@],$(PYTHON),' < $< > $@
        chmod +x $@
endif

HAVE_PYTHON 由配置脚本设置

AM_PATH_PYTHON([2.6],, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"])

这在 Unix 上可以正常工作,但在 Windows 上会出现“没有规则可以制作 tester.py.exe”。此外,正确使用 #! 行的复制和替换技术意味着我无法将测试套件分解为多个模块。

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您必须将_SOURCES 仅用于已编译的内容,这就是添加$(EXEEXT) 的原因。试试这个:

TESTS = unittests
if HAVE_PYTHON
TESTS += tester.py
# Possibly use += here depending on the rest of your Makefile.am
check_SCRIPTS = tester.py
# I added $(srcdir) here so VPATH builds still work.
tester.py: $(srcdir)/src/test/tester.py.in Makefile
        $(SED) -e 's,[@]PYTHON[@],$(PYTHON),' < $< > $@
        chmod +x $@
endif

你有什么理由不只是通过configure.ac 进行替换吗?

AS_IF([test "$PYTHON" != ":"], [AC_CONFIG_FILES([src/test/tester.py])])

这将使用config.status 重新制作脚本并自动生成重建规则。

编辑 1:

如果您真正想做的是将 python 测试器脚本作为make check 的一部分运行,我会这样做:

check-local:
if HAVE_PYTHON
        $(PYTHON) $(srcdir)/src/test/tester.py
endif

(如果需要,我将check-local 放在if HAVE_PYTHON 之外,以便您可以定义其他命令作为check-local 的一部分运行。)

你可能更喜欢写这个,而不是:

check-local:
        test "$(PYTHON)" != ":" && $(PYTHON) $(srcdir)/src/test/tester.py

请参阅 automake 手册中的extending。

【讨论】:

check_SCRIPTS,当然,我应该想到这一点。至于另一个,我认为你不能将AC_CONFIG_FILES 放在AS_IF 中,但无论如何这并不能解决必须将所有内容放在一个巨大的文件中的问题,这与正确的 Python 风格相反。我真正想要的是一种让check-TESTS 目标运行'$(PYTHON) $(srcdir)/src/test/tester.py' 而不仅仅是'./tester.py' 的方法。 (我最终可能会放弃并编写一个包装脚本,但我避免这样做,因为那样我必须处理更多的 Windows 废话。) 是的,检查本地似乎是要走的路。谢谢。

以上是关于如果 Python 可用,则选择性地启用测试程序 - automake的主要内容,如果未能解决你的问题,请参考以下文章

验证可用的网络连接和启用位置服务以使用应用程序 [重复]

多个复选框以启用/禁用javascript中的一个选择器

如果启用了身份验证,则Solr CDCR不起作用

使用Selenium和Python的日历选择器

如果字典键不可用,则返回 None

如果文件可用于 JavaScript,则启用下载按钮