Если данные не будут использоваться в дальнейшем, можно генерить их в рантайме по маске соответствия требованиям.
Если есть заранее подготовленные данные, можно хранить:
Файлы (csv, xml,…) - самый распространенный;
База данных - это избыточно для подобного кейса, но иногда необходимо;
Получать с ресурсов, сервисов, third-party components.
Последние два варианта включают интеграцию с компонентами, потому чаще всего выбирают первый вариант.
в целом не важно как брать. Думаю, как можно проще и эффективнее (для данной задачи). Данные заранее подготовлены (пара: логин / пароль, могут быть разные данные). Смотрю в сторону CSV/PlainText формата хранения данных. Или где-то в файле .java в виде массива будут перечислены эти данные.
Я бы использовал параметризацию однозначно везде (кромее тех редких случаев, когда точно знаешь, что нужно крутить цикл).
Если гонять тесты в цикле - вроде бы имеем больше контроля, но это только на первый взгляд. А на самом деле - один упавший тест может смело порушить нам всё выполнение так, что не будут возвращатсья результаты вовсе: на плечи программиста ложится отлов эксепшенов, что может быть нетривиально. Плюс само по себе выполнение толком не распараллелишь, а это будет важно в продакшене.
Параметризация - более правильная штука. Во-первых, позволяет легче распараллеливать выполнение тестов, переложив его на плечи xUnit. Во-вторых, каждый конкретный тест отдельно может упасть, и на выполнение других тестов это не повлияет. Ну и вообще это круто, трувей.
Судя по синтаксису, речь идёт о Java. Тогда у нас два варианта xUnit: JUnit или TestNG. Оба хороши, JUnit чуть стандартнее и поэтому менее гибок (параметризует классы, а не методы). Лично я привык к JUnit и использую его по причинам совместимости + историческим.
Без всякой рекламы и головной боли берешь testNG и пишешь простой дата провайдер, он реализован не в пример проще чем в jUnit. Цикл использовать не надо. Почитать если то - Varun Menon TestNG Beginner Guide