Myślę, że różnica polega na zakresie. Gdybym potrzebował tego samego parametru we wszystkich moich pakietach testów dla np. zmienne env, chciałbym użyć go w słuchacza wykonawczego ITestListener lub ISuiteListener (dla zakresu Suite), a następnie użyć ITestContext/Suitecontext zastosować wartość we wszystkich moich testów pod <test>
lub pod <suite>
Jednakże, jeśli muszę bardzo specyficzny dla konkretnych przypadków testowych, a następnie wybrałbym adnotację @Parameter na tych konkretnych testach.
Ponadto @Parameter może przyjmować tylko proste wartości, więc mogą występować przypadki, w których testy wymagają różnych obiektów (zamiast łańcuchów) w oparciu o pewną wartość parametru. W takim przypadku wolałbym czytnik danych, odczytywanie wartości param (twoja druga opcja, chociaż argument dla testklasy wydaje mi się niepoprawny), tworzenie obiektów, a następnie podawanie ich do testów. (np. prawdopodobnie nazwa pliku właściwości jest wartością parametru, która jest odczytywana, a obiekty tworzone na podstawie danych w pliku właściwości i podawane jako różne dane testowe do testów).