I actually thought about the whole "it should fail to build if
any of the unit tests fail" idea 2 or 3 weeks ago, so this sounds
good.
WRT to the error messages and their recognition by text editors,
a _massive_ improvement would be compiler-assisted formatting of
the assertion errors. This:
[email protected](2): Assertion failure
Is not useful when I wrote `assert(foo == 2)`. This, however, is:
tests.encode.testEncodeMoreThan8Bits:
tests/encode.d:166 - Expected: [158, 234, 3]
tests/encode.d:166 - Got: [158, 234]
In Python, my favourite testing framework is py.test. It reflects
on the test code itself and replaces `assert foo == 2` with its
own code so that it looks like this in the output:
def test_foo():
foo = 5
assert foo == 2
E assert 5 == 2
It also recognises things like `assert x in xs`, which is
obviously handy. Since Walter has mentioned the "specialness" of
assert before, maybe the compiler could recognise at least the
most common kinds and format accordingly (assert ==, assert in,
assert is null, assert !is null)?
The main reasons I wrote a unit testing library to begin with
were:
1. Better error messages when tests fail
2. Named unit tests and running them by name
3. Running unit tests in multiple threads
I'm address 1. above, 2. has its own thread currently and AFAIK
3. was only done my me in unit-threaded. There are other niceties
that I probably won't give up but those were the big 3.
Atila
On Monday, 30 March 2015 at 22:20:08 UTC, Andrei Alexandrescu
wrote:
This is a tooling issue.
D builds and messaging are rigged to consider unittests as a
special build followed by a special run of an application.
In brief: I'd like to transition to a model in which
unittesting is organically part of the build. After all, you
wouldn't want to deploy an application that's failing its
unittests.
Detail: Consider running a build vs. a unittest in one of the
supported editors/IDEs (emacs, vim, Code:Blocks, Visual D,
Xamarin...). During a build, an error will come in a standard
format, e.g.
std/array.d(39): Error: undefined identifier xyz
This format is recognized by the editor and allows the user to
click on it and go straight to the offending line etc.
In contrast, a failing unittest has a completely different
format. In fact, it's a format that's worse than useless
because it confuses the editor:
core.exception.AssertError@std/array.d(39): xyz
emacs will recognize the text as a filename and upon clicking
would ask the user to open the nonsense file
"core.exception.AssertError@std/array.d". This error line is
followed by a stacktrace, which is in no recognizable format.
It should be in the format of e.g. gcc remarks providing
additional information for an error, and again provide
file/line information so the user can click and see the call
stack in the source.
Where I want us to be is a place where unittests are considered
a part of the build; it should be trivial to set things up such
that unittesting is virtually indistinguishable from
compilation and linking.
This all is relatively easy to implement but might have a large
positive impact.
Please chime in before I make this into an issue. Anyone would
like to take this?
Andrei