В настоящее время я работаю над несколькими API-интерфейсами NodeJS, которые используют базу данных Neo4J.Я хочу сделать автоматические тесты на каждой конечной точке и убедиться, что все работает (например: POST пользователь должен создать пользователя узла на моем графике с ожидаемыми метками и свойствами)
Как младший разработчик, я не совсем уверен, гдедля начала.
Моя первоначальная идея состоит в том, чтобы создать базу данных Neo4j для фикстур (путем выполнения длинного запроса шифра на пустом графе, который будет генерировать данные фикстур). Проблема в том, что эта база данных фикстур будет зависеть от различныхтесты я делаю.Например, если я хочу протестировать конечную точку DELETE, я буду утверждать, что данные будут удалены из моей базы данных.
Я вижу два решения для этого:
Перед тестированиемконечной точкой я генерирую некоторые необходимые данные.Но тогда мне придется обязательно удалить их после теста, чтобы не ухудшить фикстуры и не повлиять на другие тесты конечных точек.
Перед тестированием конечной точки я очищаю базу данных, выполняю запрос фикстури выполните второй запрос, чтобы добавить дополнительные данные для проверки моей конечной точки.Тогда для каждой конечной точки обязательно должна быть чистая база данных с некоторыми дополнительными данными.
Первое решение кажется трудоемким / трудоемким, а второе - немного грубым.Возможно, моя концепция автоматизированных тестов действительно неверна.
Вот пример теста, который я провел (используя mochajs и chai), где я меняю администратора организации:
describe('UPDATE organisation', () => {
before((doneBefore) => {
const admin1 = updateOrganisationUtilities.createAdmin('admin@test.com');
const admin2 = updateOrganisationUtilities.createAdmin('admin2@test.com');
Promise.all([admin1, admin2]).then(
(admins) => {
idAdmin = admins[0].id;
idAdmin2 = admins[1].id;
updateOrganisationUtilities.bindAdminToOrganisation(idAdmin, idOrganisation)
.then(() => {
doneBefore();
});
});
});
after((doneAfter) => {
Promise.all([
updateOrganisationUtilities.deleteExtraData(),
]).then(() => {
doneAfter();
});
});
it('Should update an organisation', (doneIt) => {
const req = {
method: 'PUT',
url: `/organisations/${idOrganisation}`,
payload: JSON.stringify({
name: 'organisation-test',
address: 'here',
trainingNumber: '15',
type: 'organisation.types.university',
expirationDate: new Date(),
idAdmin: idAdmin2,
}),
headers: {
authorization: token,
},
};
server.inject(req, (res) => {
assert.equal(res.statusCode, 200);
assert.exists(res.result.id);
assert.equal(res.result.address, 'here');
assert.equal(res.result.trainingNumber, '15');
assert.equal(res.result.type, 'organisation.types.university');
updateOrganisationUtilities.getLinkBetweenAdminAndOrga(res.result.id, idAdmin2)
.then((link) => {
assert.include(link, 'IS_ADMIN');
assert.include(link, 'ROLE');
doneIt();
});
});
});
});
Как вы можете видеть:
- Я создаю некоторые полезные дополнительные данные в before ()
- Я удаляю дополнительные данные в after ()
- Метод updateOrganisationUtilities.getLinkBetweenAdminAndOrga() проверьте, правильно ли применены изменения в Neo4j.
Кажется, это работает, но я боюсь, что это будет PITA для поддержания такой структуры, когда у меня будут сотни тестов, которые могутизменить базу данных.Более того, я боюсь отнимать слишком много времени при таком способе тестирования моих конечных точек, поскольку мне приходится писать конкретные функции / запросы до и после каждого теста конечной точки.
Извините, если мой вопрос кажется широко открытым, но мне очень любопытноо том, как опытные разработчики имеют дело с автоматизированными тестами конечных точек.