Какой хороший способ генерировать случайное число для действительной кредитной карты?


Я разрабатываю набор инструментов на Java для проверки подлинности и работы с кредитными картами. Пока у меня есть поддержка для:

  • - да, - подтвердил лун.

  • Проверка даты (простой срок действия).

  • Проверка длины кода карты (CVV, CVC, CID) на основе бренда (Visa, MasterCard и т. д.).

  • Проверка длины номера кредитной карты (в зависимости от марки).

  • Проверка BIN/IIN (по базе данных valid числа).

  • Скрытие цифр (425010 * * * * * * 1234)

Чтобы сделать набор инструментов немного более полным, я хотел бы создать генератор случайных чисел кредитных карт, основанный на различных марках карт. Эта функциональность (надеюсь) сделает мои тестовые случаи немного более надежными.

В принципе, я хотел бы иметь возможность генерировать числа, которые являются:

  • LUHN valid

  • Действительно на основе бренда префиксы

  • Допустимо на основе префиксных чисел BIN/IIN

Для действительных номеров карт BIN/IIN я думаю найти случайный номер BIN/IIN из базы данных (на основе бренда, конечно), а затем добавить оставшиеся цифры с помощью Random. Очевидно, что это не будет действительным большую часть времени, и мне придется увеличить одну из цифр, пока она не пройдет проверку LUN.

Я не могу показаться, чтобы иметь возможность думать о лучшем пути. Возможно, кто-то мог бы предложи что-нибудь поумнее...?

С нетерпением ждем ваших предложений! Заранее спасибо! :)

2 7

2 ответа:

Эта функциональность (надеюсь) сделает мои тестовые случаи немного более надежными.

Я не убежден. По моему опыту, не стоит использовать случайные данные в модульных тестах, потому что вы никогда не знаете, охватили ли вы все важные случаи ... и жуки.

Я бы рекомендовал создавать номера ваших тестовых кредитных карт вручную и заботиться о том, чтобы они покрывали все случаи, которые необходимо проверить.

Не так давно я стал автором библиотеки под названием Мокнит. Одна из особенностей заключается в том, чтобы позволить разработчику генерировать различные действительные номера кредитных карт.

Проверьте этот метод: creditCards().

Краткий пример записи 1000 кредитных карт AMEX и Mastercard в файл для последующего использования:

 MockNeat m = MockNeat.threadLocal();
    final Path path = Paths.get("cc.txt");

// Write in a file 1000 credit cards AMEX and Mastercard:
 m.creditCards()
            .types(MASTERCARD, AMERICAN_EXPRESS)
            .list(1000)
            .consume(list -> {
                try { Files.write(path, list, CREATE, WRITE); }
                catch (IOException e) { e.printStackTrace(); }
            });