Certo, il loop gira tre volte (da zero a due) , mentre l'elemento test[2] non esiste.

Anche ammettendo che si possano fare dei checkbox con lo stesso nome, il loop lo fai su tutti gli elementi del form, mentre poi testi solo gli elementi con nome test[i].

Confronta con il JS che avevo fatto io: c'era un if che filtrava solo i checkbox