Control: tags -1 dh-make-elpa: new Perl-based integration tests

Xiyue Deng <[email protected]> writes:

> Hi Richard,
>
> Thanks very much for the review and suggestions!  Please see my replies
> below inline.
>
> Richard Lewis <[email protected]> writes:
>
>> On Sat, 17 Jan 2026 at 04:25, Xiyue Deng <[email protected]> wrote:
>>>
>>>
>>> I have been working on a new Perl-based unit tests and I think it's now
>>> in a usable form.  It runs dh-make-elpa in a temp directory and compares
>>> the contents of its output with the expected ones.
>>
>>> [1] https://salsa.debian.org/emacsen-team/dh-make-elpa/-/merge_requests/6
>> (i cant review the perl parts in detail though)
>>
>> I've used this approach in a couple of other packages, so thought i'd
>> offer some thoughts based on my experiences
>>
>> The pros include
>> - the test is what the underlying code is actually producing, so you
>> get confidence that the test is actually testing what a user sees
>> - you can add tests without needing to understand the code at all, and
>> the underlying code doesnt need to have any support for "testing"
>> - it's esp good when you want to know if the output has changed -- i
>> think this is a good fit for something like dh-make-elpa where
>>    if the output changes it may be unintentional, and checking "by
>> hand" is tedious
>>
>
> You helped cover several of the design goals of those tests.  Thanks!
>
>> The cons include
>> - someone has to keep the test data up-to-date
>
> I have written t/utils/check_diff_in_test_cases for this exact reason,
> which can help update the contents in `expected/' with `--update'.
> Manually doing that was really a painful experience.  I would expect one
> to have carefully inspected the diffs before committing.
>
>> - i think a lot of people in debian commit things before bothering to
>> test - more git commits fixing test failures
>> - rebasing branches and MRs that change output can be a HUGE pain
>
> This is what the tests are for IMHO.  Now we have Salsa CI and
> autopkgtest to detect the test failures, and who breaks them should fix
> them.  I think it's better than breaking the program unintentionally.
>
>> - most test failures will be "the test suite is out of date" rather
>> than "there is a bug in the package", this can de-sensitize you from
>> investigating, as once
>>   the "expected" is updated, any issues are hidden.
>
> Yes.  One needs to carefully inspect that the updated `expected/'
> contents are intended before committing.
>
> This would also promote smaller change per commit, like changing just
> one aspect and update the tests accordingly in one commit.  Changing too
> many places at once makes it hard to understand and even harder to
> reason about the diffs and hence should be discouraged.
>
>> - you are exposed to changes in other packages (*)see below
>> - (this may not apply for this package?) you are exposed to
>> differences in the build environment - it may pass in a local sbuild
>> but fail on salsa, or in the debian build system, or debusine, or in
>> stable vs unstable
>
> IMHO this should expose a bug either in the package or the tests and
> should be fixed.  So far it passes local sbuild and Salsa CI at least :P
>
>> - generally anything that makes the output non-reproducible, like
>> timestamps are a pain.
>
> Indeed.  Which is why I generate the diff by excluding any lines that
> includes a timestamp[1] (I'm lazy :P).  Admittedly this is not very
> robust.
>
> I have seen some other software sanitize any timestamp to use "X" to
> replace each character, which may be a better way to handle this.
>
>> - everyone making changes to the package will need to understand how it works
>
> Hopefully it's not too complicated to understand: it's basically running
> `diff' for comparison :)
>
>> - in every case ive tried, yu end up needing a way to "filter" the
>> 'actual' output before comparison to avoid all the unreproducible
>> bits!
>>
>
> Ack.  Similar as the point on timestamp above.
>
>> (i think the benefits are more than the costs for a "stable",
>> slow-moving package with an active maintainer!)
>>
>
> Thanks!
>
>> *i did notice that you are hard-coding the contents of a "new git
>> repos" including all the hook templates (eg
>> t/data/github_team/repo/git/hooks/commit-msg.sample )-  this means
>> when a new version of git makes a change (even changing the comments
>> in a template,  the test will fail (and maybe block a new git from
>> migrating?). I dont know if you can instead do a fresh "git init" and
>> copy the .git into the "expected" directory before doing the
>> comparison, rather than holding it in the repo?
>
> The part of `.git' that matters is the `.git/config' file, and
> dh-make-elpa uses the `upstream' branch info for generating the
> `debian/watch' file, so the contents of hooks and info directories don't
> really matter.  As a lazy person, I just did `git init' and edit
> `.git/config' for the tests.  And it turns out those are not needed at
> all, so I just removed them (and updated the MR).  Thanks for pointing
> this out!
>
> [1] 
> https://salsa.debian.org/emacsen-team/dh-make-elpa/-/blob/perl-based-unit-tests/t/lib/TestHelper.pm?ref_type=heads#L125-128

Friendly ping for comments.  It would be good to hear from Sean or David
as I plan to work on similar tests on dh-elpa as well, and would like to
see whether this is an acceptable approach.

(Also renamed to `integration test' as they were not really unit tests.)

-- 
Regards,
Xiyue Deng

Attachment: signature.asc
Description: PGP signature

Reply via email to