2012-05-31 2 views
1

Я разрабатываю отдельное приложение для тестирования веб-сайта с использованием Selenium Webdriver. Приложение будет использовать пользовательский интерфейс JavaFX или Swing, чтобы пользователь мог загрузить файл тестового набора и выбрать, какие тесты будут запущены, и какой браузер будет запускать их. Пользовательский интерфейс также будет захватывать данные, используемые в тестах, таких как имена пользователей и пароли.передать пароль junitcore

Я планирую использовать JUnitCore для запуска выбранных классов тестов, но мне нужно будет передать данные из пользовательского интерфейса в тестовые классы. Для большинства данных я могу сделать это с помощью System.setProperty (prop, value). Однако мне также нужно будет пройти админ и другие пароли для веб-сайта для тестов

Каким будет лучший способ пройти пароль (ы) к тестам?

Каковы были проблемы с безопасностью при использовании System.setProperty для хранения паролей? Должен ли я вместо этого шифровать данные и хранить их в файле, а тесты проверять файл и расшифровывать данные? Это, очевидно, увеличило бы объем обработки, необходимый для настройки каждого теста.

ответ

0
  • Если пользователь, который управляет пользовательским интерфейсом, знает пароли, то я действительно не вижу ваших проблем с безопасностью. С кем вы защищаетесь?
  • Если пользователь, который управляет пользовательским интерфейсом, не знает паролей (и пароли должны быть сохранены в самих тестовых окнах), то вы в разборке - шифрование - это хорошо, но вы должны как-то хранить пароль для дешифрования ... бесконечный круг, нет безопасного пространства. Даже если хранилище безопасно, слабыми точками, безусловно, является передача в браузер (который будет выполняться как простая строка, инкапсулированная в JSON независимо от того, что) и автоматическое вложение в браузер. Серьезно, если вы не доверяете машинам, на которых запущены тесты, не храните пароли.

Однако в первом случае (когда пользователь должен ввести пароль в UI), чтобы свести к минимуму возможность угрозы, а также для максимального удобства, я бы это сделать:

  1. создать singleton класс PasswordHolder
  2. PasswordHolder будет запоминать пароли (given to them by JPasswordField) в Map<String, char[]> или Map<String, Password> где ключ некоторый идентификатор пароля и значение является паролем сам
  3. раз пароль будет доступен через getPassword() метод, it's contents would get nullified

реализация на быстрый образец (для дальнейшего совершенствования, как я надеюсь, что я не буду забывать включать что-нибудь важное ... но это может произойти). Я думаю, что это своего рода говорит само за себя:

public class PasswordHolder { 

    private static PasswordHolder instance = null; 
    private final Map<String, Password> map = new HashMap<String, Password>(); 

    private PasswordHolder() { 
     // nothing to do 
    } 

    public static PasswordHolder getInstance() { 
     if (instance == null) { 
      instance = new PasswordHolder(); 
     } 
     return instance; 
    } 

    public void addPassword(String name, char[] pass) { 
     if (map.containsKey(name)) { 
      // throw some sort of Exception("Duplicate password name, man.") 
     } 
     map.put(name, new Password(pass)); 
    } 

    public Password getPassword(String name) { 
     return map.get(name); 
    } 

} 

Как наиболее удобная вещь, я написал Password быть CharSequence так полезно с sendKeys(CharSequence keys). К сожалению, sendKeys() использует toString(), так что вы все равно должны сделать строку из пароля (что считается плохой практикой).

public class Password implements CharSequence { 

    private final char[] pass; 
    private final BitSet nulled; 

    Password(char[] pass) { 
     this.pass = pass; 
     nulled = new BitSet(pass.length); 
    } 

    private void nullify(int start, int end) { 
     for (int i = start; i < end; i++) { 
      pass[i] = '\0'; 
     } 
     nulled.set(start, end); 
    } 

    @Override 
    public int length() { 
     return pass.length; 
    } 

    @Override 
    public char charAt(int index) { 
     if (nulled.get(index)) { 
      // throw some Exception("That character has already been read!") 
     } 
     char ret = pass[index]; 
     pass[index] = '\0'; 
     nulled.set(index); 
     return ret; 
    } 

    @Override 
    public CharSequence subSequence(int start, int end) { 
     if (nulled.get(start, end).cardinality() > 0) { 
      // throw some Exception("Some of the characters has already been read!") 
     } 
     Password subPass = new Password(Arrays.copyOfRange(pass, start, end)); 
     nullify(start, end); 
     return subPass; 
    } 

    @Override 
    public String toString() { 
     if (nulled.cardinality() > 0) { 
      // throw some Exception("Some of the characters has already been read!") 
     } 
     String str = new String(pass); 
     nullify(0, pass.length); 
     return str; 
    } 

} 
+0

Кроме того, я хотел бы видеть (и мои руки на) пользовательский интерфейс для испытаний;) –

+0

Большое спасибо за вашу помощь. Пользователь, который запускает программу, будет знать пароли, поэтому я вижу ваш вопрос о том, от кого я буду защищать их. Это для моего собственного академического интереса, но если я разработаю что-то, что может быть в целом полезным, а не только для определенного сайта, я поделюсь им. –

+0

Вот что я подумал, и это то, на что я рассчитывал, когда писал эти классы. В любом случае, постарайтесь сделать пароль как можно более кратким, попробуйте избежать использования String, добавьте простое шифрование, если вам это нравится (это тоже замечательное упражнение!). Также есть новая реализация 'Password'. –

Смежные вопросы