News for hackers. Stuff that matters.
Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by sph on Friday November 25, 2022 @09:43AM (#33742787)
To add to Guillermo's mantra, a good suggestion from the video I posted is "write tests exercising the internal logic before a big refactor. Then remove them."

Because otherwise, the more tests you have against implementation details, the more times your tests will break just because you've moved some code around. Tests need to go red when there is a bug, not because you've renamed a couple of private methods and now the mocks are broken.

Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by marginalia_nu on Friday November 25, 2022 @10:18AM (#33743110)
Depends a lot on what it is you're doing. Like if you're writing some finnicky library code, exotic algorithms or data structures or whatever, you'll probably want more test lines than code lines because that sort of stuff is notoriously difficult to get right. Even something as pedestrian as a binary search is downright gnarly to get working in all cases[1], the bugs are difficult to reason about and the code doesn't reduce to more comprehensible primitives.

On the other hand, if you do that with application code, you're essentially submerging your code in a tar pit. Any change in behavior will require changing dozens of tests. Fixing broken tests will become so routine that they stop telling you anything about your code. Development will become "I changed from foo to bar, now let's update the 73 assertions that failed to whatever value the test runner says they have now".

[1] https://stackoverflow.com/a/6393352

Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by arkh on Friday November 25, 2022 @10:14AM (#33743080)
To go farther: tests should not break during a refactoring. They're here to let you know if your refactoring broke something. They should even be green when you decide to scratch your software to rewrite it in another language.

Code coverage? Use it to determine what is dead code you can remove: if your tests don't go through some code, that code is useless.

Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by GTP on Friday November 25, 2022 @12:07PM (#33744470)
I agree with the first part of your comment, but not the second. Achieving 100% code coverage is very hard and sometimes unreasonable. E.g. How do you test a GUI? I think that often it is better to write tests for the application logic and test a GUI by using it.
Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by anthonypasq on Friday November 25, 2022 @01:13PM (#33745193)
this is simply not possible. if you move a method from one class to another every unit test breaks.
Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by 3a2d29 on Friday November 25, 2022 @02:22PM (#33745866)
question:

How do unit tests stay green when you rewrite in another language? Are your tests an external API you call?

Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by wstuartcl on Saturday November 26, 2022 @12:42PM (#33754784)
Rewrites are not super common -- but IMHO if you must do one the first step is to move the tests over. Unless your goal with the rewrite is to rearchitect the interfaces at which point your basically greenfielding anyways.
Re:Ask HN: Why the Linux Kernel doesn't have unit tests? by hinkley on Friday November 25, 2022 @01:14PM (#33745205)
If you’re using a lot of mocks you’re gonna have a bad time.

I think I can agree with the sentiment that mock heavy tests should be short lived, and why you don’t want to keep those around. Not sure I can agree with the rest.

I aim for max of two stubs per test, and many of those end up with a TODO. Pure functions need no stubs, and most well factored code should only need at most one. One stub one test is pretty sustainable. It’s easy to rewrite such a test if the requirements change. Unit tests should absolutely be disposable, but you don’t dispose of them all at the same time. Just the ones that don’t fit the new rules.

I do run into a steady stream of people who can’t seem to understand that the tests should affect the structure of your code. “And then a miracle happens” is what you have there - long intervals where the system produces no verifiable state or output is bad. That’s not an architecture. It’s lack of it. A functional programming style makes this easier to avoid, but it’s not a cure, because the disease is in their heads, the code is the symptom.

There’s a substantial overlap between people with untestable code and people with undocumentable code. They can’t explain the code to the test framework any better than they can explain it to each other.

All that said, testing is hard. It shouldn’t be this hard and we need to keep looking for ways to improve that situation. But even here we have people who reach for the least expressive solution quite frequently, such as assert over more reflective matchers, which make for much more useful red tests. At least BDD style seems to be winning out.