Я работаю над многопользовательской настольной игрой в реальном времени, построенной с использованием node и socket.io для внутреннего интерфейса и response + redux для внешнего интерфейса. Я впервые делаю подобный проект, то есть в реальном времени и многопользовательский.
Я не уверен, как лучше всего провести интеграцию / тестирование системы. Как я могу на самом деле автоматизировать раскрутку, скажем, 10 интерфейсов, и заставить их вместе играть в игру? Следует ли мне использовать для этого среду тестирования, и если да, то какая из них будет хорошим выбором и почему?





Я нашел этот вопрос с тем же вопросом. Я выяснил, как это работает, и я предполагаю, что у вас тоже есть, но чтобы кто-то другой столкнулся:
Уточнение терминов: интеграционное тестирование может быть выполнено для реакции с такими вещами, как Jest + фермент, используя mount (). Я отвечаю на это, основываясь на поиске сквозного / приемочного тестирования, когда вы, по сути, тестируете свой продукт с точки зрения пользователя (здесь, перемещаясь по веб-сайту).
Поскольку это с точки зрения пользователя, я полагать не имеет значения, что вы используете React.
Итак, как это сделать? Есть множество вариантов тестирования JS. Этот ресурс может помочь понять, какой пакет тестирования вы можете выбрать. Вам нужно что-то, имитирующее реальный браузер.
Изучая некоторые из вариантов, перечисленных в указанном выше ресурсе, я обнаружил, что:
редактировать: Я изначально предлагал использовать кошмар. Тем не менее, при запуске нескольких тестов у меня было странное поведение (неожиданные таймауты, экземпляры Electron не закрываются должным образом), и я исследовал некоторые другие варианты. Но я сохраню информацию для справки:
Я выбрал ночной кошмар, потому что он рекламировался как простой.
Ниже приведен пример теста с использованием Jest и nightmare (и некоторого неаккуратного TypeScript). На сайте есть кнопка для завершения хода игрока и заголовок, указывающий, чей это ход. Я имитирую щелчок по этой кнопке и проверю, что заголовок изменится должным образом. Также обратите внимание, что вам понадобится ваш сервер разработки и интерфейс, работающий во время этих тестов.
import * as Nightmare from 'nightmare';
let nightmare1: Nightmare;
let nightmare2: Nightmare;
beforeEach(async () => {
nightmare1 = new Nightmare({ show: true })
nightmare2 = new Nightmare({ show: true })
await nightmare1
.goto('http://127.0.0.1:3000');
await nightmare2
.goto('http://127.0.0.1:3000');
});
afterEach(async () => {
await nightmare1.end();
await nightmare2.end();
});
it('sockets turn changes via End Turn button', async () => {
expect.assertions(6);
// Both display the same player's turn ("Red's Turn")
const startingTurnIndicator1 = await nightmare1
.evaluate(() => document.querySelector('h1').innerText);
const startingTurnIndicator2 = await nightmare2
.evaluate(() => document.querySelector('h1').innerText);
expect(startingTurnIndicator1).toBe(startingTurnIndicator2);
// Both change ("Blue's Turn")
const oneClickTI1 = await nightmare1
.click('button')
.evaluate(() => document.querySelector('h1').innerText)
const oneClickTI2 = await nightmare2
.evaluate(() => document.querySelector('h1').innerText);
expect(oneClickTI1).toBe(oneClickTI2);
expect(oneClickTI1).not.toBe(startingTurnIndicator1);
// Both change back ("Red's Turn")
const twoClickTI2 = await nightmare2
.click('button')
.evaluate(() => document.querySelector('h1').innerText)
const twoClickTI1 = await nightmare1
.evaluate(() => document.querySelector('h1').innerText);
expect(twoClickTI1).toBe(twoClickTI2);
expect(twoClickTI1).toBe(startingTurnIndicator2);
expect(twoClickTI1).not.toBe(oneClickTI1);
});
Я не уверен, насколько хорошо является фактическим кодом в этом тесте, но он работает.