unexpectedjs / unexpected

Unexpected - the extensible BDD assertion toolkit
http://unexpected.js.org/
MIT License
370 stars 29 forks source link

'to be an array whose items satisfy' slowness and verbosity #318

Open msiebuhr opened 8 years ago

msiebuhr commented 8 years ago

I currently move some bulk data between various databases with some processing on the side. For testing a do a small-ish query that results in a few thousand elements and verify the looks OK. Paraphrasing:

x = [];
while (x.length < 1000) { x.push({foo: "bar"}); }
x[100].foo = 'baz';

expect(x, 'to be an array whose items satisfy', function (i) {
    expect(i, 'to satisfy', { foo: "bar" });
});

When it fails, it takes a few seconds to execute and print the output, pretty-printing the entire dataset to the console. (Which, given moderately complex objects, can be quite difficult to devour.)

I've used two strategies to avoid this so far:

Given that passing runs aren't noticeably slow, it has to be generation of the output that causes things to slow down.

I propose two strategies for dealing with this:

sunesimonsen commented 8 years ago

This is a very good point. I haven't used Unexpected for a lot of integration testing so I haven't been running into these limitations. Unexpected should of cause handle this situation well.

I think we need to batch the checks up into chunks otherwise we wont be able bail out. I think it makes sense to only show 10 or 20 errors and then just state that there are more errors. I also like the idea of not showing all the items that passed.

sunesimonsen commented 8 years ago

For the needle in the haystack problem, what about something like this:

expected array to have items satisfying to be a number

[
  0,
  // indexes from 1 to 1251 collapsed
  1252,
  '1253', // to be a number
  1254,
  // indexes from 1255 to 1499 collapsed
  1500
]
sunesimonsen commented 8 years ago

@papandreou do you have any opinions on this subject.

papandreou commented 8 years ago

Those are fine ideas! Would be nice to derive some principles and apply to other assertions, especially to satisfy.

msiebuhr commented 8 years ago

I don't really think this is applicable to to satisfy; those are typically hand-written and not overly large (at least that's what I do). The array/object assertions allow to automate detailed checks on extremely large data-structures, making the output the more overwhelming...