Honestly I don’t write that many tests these days other than integration and functional tests. The assertions are incredibly good at breaking those if anything goes wrong so you need less (unit) test cases. The test cases are always brittle too.
As for strategies, I pepper asserts on inputs and outputs of functions to remove any assumptions about scale and state which are not enforceable by the contract at compile time. Additionally I will tend to assert conditions which need to be in place within the functions. Rarely does anything need any more than that.
Assertions are left in production and any identifiable errors or throws are turned into defects and resolved as priority 1 cases.
As for strategies, I pepper asserts on inputs and outputs of functions to remove any assumptions about scale and state which are not enforceable by the contract at compile time. Additionally I will tend to assert conditions which need to be in place within the functions. Rarely does anything need any more than that.
Assertions are left in production and any identifiable errors or throws are turned into defects and resolved as priority 1 cases.