Yes they are not equivalent, but creating languages without a strict type system and the proposition of test driven development are going back and fort in strictness. It is beneficial to have a more strict programming language, but it can be uncomfortable and burdensome. So I find interesting we keep going back and forth in this dimension.
They're a good substitute for many of the use cases of testing.
> if a test works after retrying it then it is probably not something that a type system would be able to catch.
Type systems are pretty good at catching incorrect concurrency logic these days, and getting better all the time.