unittests are really part of the build, not a special run

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Tue Mar 31 23:31:41 PDT 2015


On 2015-03-31 23:12, Atila Neves wrote:
> 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:
>
> core.exception.AssertError at foo.d(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)?

I kind of agree, RSpec has similar formatting of failed tests. But I 
leaning to that this should be handled by a library. RSpec has a lot of 
matchers (assertions) and supports custom matchers as well. For example, 
for associative arrays RSpec will print a diff of the two objects.

For example, the following test:

describe 'Foo' do
   it 'bar' do
     { foo: 3, bar: 4, baz: 5 }.should == { foo: 3, bar: 4, baz: 6 }
   end
end

Will print the following failures:

Failures:

   1) Foo bar
      Failure/Error: { foo: 3, bar: 4, baz: 5 }.should == { foo: 3, bar: 
4, baz: 6 }
        expected: {:foo=>3, :bar=>4, :baz=>6}
             got: {:foo=>3, :bar=>4, :baz=>5} (using ==)
        Diff:
        @@ -1,4 +1,4 @@
         :bar => 4,
        -:baz => 6,
        +:baz => 5,
         :foo => 3,

      # ./spec/text_mate/helpers/options_helper_spec.rb:6:in `block (2 
levels) in <top (required)>'

It also prints the comparison operator used.

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list