On 14/06/2025 15:44, Michael Van Canneyt via fpc-devel wrote:
I have heaps and heaps of testcases, but I've never felt the need to
investigate
the speed of the Assert* calls.
I wasn't actually looking at it... I found it by random chance.
I was trying to kcachegrind some of my code, and the results said that
the majority of time went into string handling that wasn't part of the
tested code.
Millions of AssertEquals calls ? I'm surprised that you are surprised
it takes so long? :-)
I haven't counted them.
But some of my tests are simply fuzzing (ish) tests (not necessarily
random, but just throwing large amount of data at the code).
If you present a patch to avoid constructing the message in case the
test is
OK, that's certainly fine for me.
I may... Need to find some time.
Also, what do you think about overloading AssertEquals (and the like) taking
AssertEqual(
const AnFormatString: string;
const AFormatData: array of const;
AnExpect,
AnActual: TFoo
)
?
That allows to defer the call to format too.
Or to replace
AssertEqual('Testing element ' + inttostr(n), ...)
with
AssertEqual('Testing element %d', [n], ...)
But then please do it so the comparison is done only once, i.e.
something like:
if aExpected=aValue then
Inc(AssertCount)
else
Fail(ComparisonMsg(aMessage, aExpected,aValue),CallerAddress);
Either that, or (protected or public)
procedure CheckEqual(AExp, AnActual: integer): Boolean; overload;
begin
result := aExpected=aValue;
Inc(AssertCount) ;
end
procedure AssertEqual
if not checkequal(AExp, AnActual) then
Fail(....)
Either one can be marked inline. But doesn't have to, even non inline
they are fast enough.
After all, its testcases, its not about a few seconds extra or less.
But the changes for me, brought some tests from 5 minutes to just 1
minute. And that helps, if I am making changes to the tested code....
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel