Anything you have in your checkVariants() calls could be done from testing, how much effort that might actually be depends many things (external dependencies, coupling levels etc.) but it would clean the code up from one point of view. How testable a code-base developed against assertions would be without some refactoring I'm not sure.
I agree with @duros, these shouldn't be thought of as exclusive or competing approaches. In fact in a TDD environment you could even argue that the 'requirement' assertions would be need to have tests:).
Asserts however DO NOT make code more robust unless you actually do something to fix the failed check, they just stop data getting corrupted or similar, usually by aborting processing at the first sign of trouble.
A test driven/well tested solution will have typically already thought about and/or discovered many of the sources/reasons of bad inputs and outputs whilst developing the interacting components and already dealt with them closer to the source of the problem.
If your source is external and you have no control over it then to avoid cluttering up your code dealing with other codes problems you might consider implementing some sort of data-cleansing/assertion component in between the source and your component and put your checks in there.
Also I'm curious to what languages your using that doesn't have some sort of xUnit or other testing library that someone has developed, I thought there was pretty much something for everything these days?