Testing should be done by the implementer.
However, the implementer is aware of the code as has assumptions which could lead to missing valid test cases (white-box testing).
Black-box testing (not knowing the code) is also a good approach, because it approaches the testing process without any assumptions.
User testing is also important, because the user is the one that uses the software.