Что “правильный” путь состоит в том, чтобы протестировать вывод методов Java?

Короткий ответ: , вы не можете .

Как правило, разрешения на уровне сервера не распространяются на отдельные объекты в базах данных. Единственным исключением является роль sysadmin, которую я настоятельно рекомендую вам , а не использовать для этой цели, поскольку вы по существу передадите контроль над всем экземпляром сервера каждому члену. [1111 ]

В качестве краткости вы можете использовать встроенные роли базы данных, чтобы избавить себя от проблем. Для доступа только для чтения обычно достаточно членства в роли db_datareader, если только у вас нет хранимых процедур, которые возвращают наборы данных, которые эта роль должна выполнять. Существует также аналогичная роль для модификации, db_datawriter, но она не распространяется на разрешение execute. Таким образом, для этого вам нужно будет создать собственную роль:

create role [DataChanger] authorization [dbo];
go
alter role [db_datareader] add member [DataChanger];
go
alter role [db_datawriter] add member [DataChanger];
go
grant execute to [DataChanger];
go

-- Now you can add your members. Here is a reader
create user [Domain\MyUser1] from login [Domain\MyUser1];
go
alter role [db_datareader] add member [Domain\MyUser1];
go
-- Writer
create user [Domain\MyUser2] from login [Domain\MyUser2];
go
alter role [DataChanger] add member [Domain\MyUser2];
go

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

Вам придется делать это в контексте каждой пользовательской базы данных, которой вы хотите управлять таким образом. Вероятно, вы можете создать задание агента SQL, которое будет запускаться периодически, и вносить эти изменения в любые пользовательские базы данных, у которых их еще нет (например, если база данных была восстановлена ​​из более ранней резервной копии, или перенесена с другого сервера, или нового один был создан). Кроме того, поскольку вы не можете циклически проходить по базам данных в статическом коде, вам нужно будет обернуть его в динамический SQL и выполнить цикл по sys.databases или, возможно, с помощью недокументированной системной хранимой процедуры . Да, и не забудьте удалить все эти операторы go из динамического кода, поскольку они не являются частью SQL и распознаются только SSMS и sqlcmd.

P.S. Несмотря на это, я надеюсь, что вы не собираетесь управлять производственными базами данных таким образом. Я даже не знаю, с чего начать, насколько небезопасен этот подход.

5
задан David Wolever 19 March 2009 в 16:45
поделиться

7 ответов

То же самое.

    int[][] tests = {
            {2, 4},
            {3, 9},
            {10, 100}
    };
    for (int[] test : tests) {
        assertEquals(test[1], f(test[0]));
    }

Конечно, не настолько симпатичный, как Python, но немного вещей.

Можно также хотеть изучить Теории JUnit, будущую функцию...

11
ответ дан 18 December 2019 в 07:56
поделиться

Взгляните на Параметризованный исполнитель тестов в Junit.

http://junit.org/apidocs/org/junit/runners/Parameterized.html

Похоже, что это сделает точно, что Вы ищете.

3
ответ дан 18 December 2019 в 07:56
поделиться

Правильный путь пишет отдельные операторы контроля, даже если Вам не нравится он.

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

Однако при генерации данных тестирования автоматически, это - другая история.

5
ответ дан 18 December 2019 в 07:56
поделиться

Вы только определили бы простой класс с двумя полями, реальным результатом и ожидаемым результатом и затем циклом по набору похожим способом к тому, что делает Ваш отрывок Python?

0
ответ дан 18 December 2019 в 07:56
поделиться

Гм...

int[][] tests = new int[][]{
        {2, 4},
        {3, 9},
        {10, 100},
    };

for(int[] i : tests)
{
    assertEquals(i[1], f(i[0]);
}

То же самое, действительно. Единственной проблемой является отсутствие Java литерала кортежа, таким образом, для более сложных случаев, необходимо будет использовать Объект [] массивы и бросить или записать класс Кортежа.

1
ответ дан 18 December 2019 в 07:56
поделиться

Определенно не эксперт по поблочному тестированию, но я предпочел бы иметь отдельный метод для каждого случая, против которого я тестирую и использую некоторый тест рабочие инструменты (как NUnit-GUI для C#). Тем путем я точно знал бы, какой случай перестал работать, если он делает. Его больше работы, чтобы сделать, но я думаю, что она в конечном счете окупается хорошо.

0
ответ дан 18 December 2019 в 07:56
поделиться

В Java нет никаких кортежей, но Вы могли использовать Карту или два параллельных массива, чтобы указать пар ввода/вывода и затем сделать цикл точно так же, как Ваш пример Python.

0
ответ дан 18 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: