Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
msiebuhr opened this issue Jul 11, 2016 · 5 comments
Open

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

msiebuhr opened this issue Jul 11, 2016 · 5 comments

Comments

@msiebuhr
Copy link
Contributor

msiebuhr commented Jul 11, 2016

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:

  • Doing a canary test on the first element, to speed up the case where I fail at everything.
  • Skipping the outer expect and forEach'ing over the elements

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:

  • Stop printing after first N failures (in particular, when everything fails).
  • Only print a few successful cases before and after each failing element, omitting the large majority of correct output.
@sunesimonsen
Copy link
Member

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
Copy link
Member

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
Copy link
Member

@papandreou do you have any opinions on this subject.

@papandreou
Copy link
Member

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

@msiebuhr
Copy link
Contributor Author

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...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants