我正在迈出打包的第一步,并不断学习l3build
,这很棒,并且在任务中节省了大量工作,但有一件事我无法弄清楚:如何使用 LaTeX 开发格式进行回归测试。
自从他们被宣布以来我就已经知道他们的存在(https://www.latex-project.org/publications/2019-FMi-TUB-tb125mitt-dev-format.pdf),我相信这是一个非常受欢迎的发布工作流程改进,而且现在我有机会,我很乐意使用它。
据我从l3build
的文档中了解到,我们有checkengines
(复数) 和checkformat
(单数) 作为要设置的变量,后者默认为"latex"
。我们还可以使用 指定非标准引擎/格式组合specialformats
。我没有尝试用checkengines
一些“按摩” specialformats
,因为这似乎延伸了变量名称的语义(我也想不出任何明显的方式来做到这一点)。我也不想代替 "latex"
在"latex-dev"
其中checkformat
,我想运行回归测试两个都(我很乐意为此付出时间)。
在我看来,这l3build
将是 LaTeX 开发格式最突出的用例之一,所以我推测有一些(简单的)方法可以做到这一点。但我似乎无法弄清楚。我该怎么做?
编辑:在 Ulrike 的评论帮助下,我能够取得一些进展,但还没有完全实现。
例如build.lua
:
#!/usr/bin/env texlua
-- Identify the bundle and module
bundle = ""
module = "mytest"
-- Two runs for label testing
checkruns = 2
-- Include LaTeX dev formats in regression testing
checkengines =
{
"pdftex" ,
"xetex" ,
"luatex" ,
"pdftexdev" ,
"luatexdev" ,
"xetexdev"
}
specialformats = specialformats or {}
specialformats["latex"] = specialformats["latex"] or
{
pdftexdev = { binary = "pdftex" , format = "pdflatex-dev" },
xetexdev = { binary = "xetex" , format = "xelatex-dev" },
luatexdev = { binary = "luahbtex" , format = "lualatex-dev" },
}
我可以运行检查,因为正确的二进制文件是用正确的格式调用的(据我所知)。
但是,结果比较步骤仍然出了问题。请考虑下面的简单测试文件mytest01.lvt
:
\documentclass{article}
\input{regression-test}
\usepackage{hyperref}
\begin{document}
\section{Section 1}
\label{sec:section-1}
\START
\setbox0=\hbox{\ref{sec:section-1}}
\showbox0
\OMIT
\end{document}
其结果与引擎相关,因此必须与引擎的结果进行比较,而不是与默认引擎进行比较。因此,我们使用以下方法保存每个引擎的结果:
$ l3build save -e pdftex mytest01
$ l3build save -e luatex mytest01
$ l3build save -e xetex mytest01
$ l3build save -e pdftexdev mytest01
$ l3build save -e luatexdev mytest01
$ l3build save -e xetexdev mytest01
但是我们刚刚保存的检查失败了(luatexdev
在这种情况下):
$ l3build check
Running checks on
mytest01 (1/1)
--> failed
Check failed with difference files
- ./build/test/mytest01.luatexdev.diff
检查结果显示mytest01.luatexdev.tlg
与 相同mytest01.luatex.tlg
(正如我所料)。 并且mytest01.luatexdev.diff
就像mytest01.luatexdev.tlg
和默认值之间的差异一样mytest01.tlg
(这是我对发生的事情的猜测)。
答案1
为了不让这个问题悬而未决,我将提供一个自我回答(感谢@UlrikeFischer 的评论)。事实证明,Ulrike 的提示是正确的(像往常一样),而我发现的问题lualatex-dev
是由于上游错误(已报告并修复于https://github.com/latex3/l3build/issues/215,感谢@MarcelKruger),它已经是最新l3build
版本的一部分。有了它,我们可以进行以下设置。
build.lua
:
-- Identify the bundle and module
bundle = ""
module = "mypackage"
-- Two runs for label testing
checkruns = 2
-- Set up tests for dev format
checkengines = {"pdftex","luatex","xetex","pdftexdev","luatexdev","xetexdev"}
specialformats = specialformats or {}
specialformats.latex =
{
pdftexdev = { binary = "pdflatex-dev" , format = "" } ,
luatexdev = { binary = "lualatex-dev" , format = "" } ,
xetexdev = { binary = "xelatex-dev" , format = "" } ,
}
测试文件mytest01.lvt
:
\documentclass{article}
\input{regression-test}
\usepackage{hyperref}
\begin{document}
\section{Section 1}
\label{sec:section-1}
\START
\setbox0=\hbox{\ref{sec:section-1}}
\showbox0
\OMIT
\end{document}
我们可以将测试结果保存为:
$ l3build save -e pdftex mytest01
$ l3build save -e luatex mytest01
$ l3build save -e xetex mytest01
$ l3build save -e luatexdev mytest01
$ l3build save -e xetexdev mytest01
pdftexdev
不包含在保存步骤中,这意味着它将与默认引擎进行比较,即。不幸的是,我们无法省去和 的pdftex
保存步骤,因为默认引擎无法通过引擎配置,所以我们必须保存它们。luatexdev
xetexdev
对设置的实验观察luatexdev
:对于它,可以使用binary = "lualatex-dev" , format = ""
或binary = "luahbtex" , format = "lualatex-dev"
。看似更标准的binary = "luatex" , format = "lualatex-dev"
确实给了我一个令人讨厌的“警告:您正在切换到 fmtutil 的每个用户格式。请阅读以下警告!”等。
请注意,我们可以采用稍微不那么冗长的设置,不需要设置specialformats
,只需执行即可,例如:
checkengines = {"pdftex", "luatex", "xetex", "pdflatex-dev"}
这是有效的,因为l3build-check.lua
在运行测试时执行以下操作:
local binary = engine
local format = gsub(engine,"tex$",checkformat)
-- Special binary/format combos
local special_check = specialformats[checkformat]
if special_check and next(special_check) then
local engine_info = special_check[engine]
if engine_info then
binary = engine_info.binary or binary
format = engine_info.format or format
checkopts = engine_info.options or checkopts
end
end
因此,对于"pdflatex-dev"
引擎来说,二进制文件将是pdflatex-dev
,由于它不以 结尾tex$
,因此format
gsub
正则表达式将不匹配,格式也将是pdflatex-dev
。我更喜欢使用更冗长的设置,因为依赖这样的实现细节来获得正确结果似乎有些不靠谱。因此,specialformats
我们可以独立于该正则表达式明确设置binary
和。format
gsub