IMHO, the best way to test for understanding is to give students a problem that is very similar to one they've seen before, but not of the exact same form to one they've seen. This does a really good job distinguishing those students who have understood the concepts and can apply them from students who just memorize how to solve problems.