Skip to content

Commit 981dc1c

Browse files
Merge pull request #436 from OSLL/395_selenium
395 selenium
2 parents 68339ef + 9c7e47e commit 981dc1c

19 files changed

+251
-112
lines changed

.dockerignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ venv
66
__pycache__
77
Dockerfile*
88
app/playground
9-
tests/selenium

.github/workflows/main.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ jobs:
2222
2323
- name: Build docker-compose
2424
run: |
25-
docker compose build
25+
docker compose -f docker-compose.yml -f docker-compose-selenium.yml build
2626
2727
- name: Run docker-compose
2828
run:
29-
APP_CONF=../app_conf/testing.ini docker compose up -d
29+
APP_CONF=../app_conf/testing.ini docker compose -f docker-compose.yml -f docker-compose-selenium.yml up -d
3030

3131
- name: Run tests
3232
run: |
3333
docker ps -a
3434
docker compose logs
35-
docker exec web_speech_trainer-web-1 bash -c 'cd /project/tests && pytest .'
35+
docker exec web_speech_trainer-web-1 bash -c 'cd /project/tests && pytest --ignore=selenium'
36+
docker exec web_speech_trainer-selenium-tests-1 bash -c 'pytest .'

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
.venv
22
venv
3-
.venv
43
.idea
54
ssl
65
__pycache__

Dockerfile_selenium

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
FROM selenium/standalone-chrome:137.0-chromedriver-137.0-grid-4.33.0-20250606
2+
3+
WORKDIR /usr/src/project
4+
5+
USER root
6+
RUN apt-get update && \
7+
apt-get install -y python3 python3-pip && \
8+
rm -rf /var/lib/apt/lists/*
9+
10+
COPY tests/requirements.txt requirements.txt
11+
RUN pip install -r requirements.txt
12+
13+
COPY tests/selenium selenium
14+
COPY tests/test_data test_data
15+
COPY tests/simple_phrases_russian.wav simple_phrases_russian.wav
16+
17+
COPY app/config.py app/config.py
18+
COPY app_conf/testing.ini app_conf/testing.ini
19+
20+
ENV PYTHONPATH='/usr/src/project/:/usr/src/project/app/'
21+
22+
# CMD ["pytest", "-s", "."]

Dockerfile_test

Lines changed: 0 additions & 17 deletions
This file was deleted.

app/routes/lti.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def lti():
2323
an empty dictionary with 404 HTTP return code if access was denied.
2424
"""
2525
params = request.form
26+
2627
consumer_key = params.get('oauth_consumer_key', '')
2728
consumer_secret = ConsumersDBManager().get_secret(consumer_key)
2829
request_info = dict(

app/static/js/recording.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ let gumStream,
66
timer;
77

88
function startRecording() {
9-
console.log("call startRecording(). Try to call navigator.mediaDevices.getUserMedia")
10-
console.log(navigator)
11-
console.log(navigator.mediaDevices)
9+
console.log("call startRecording(). Try to call navigator.mediaDevices.getUserMedia");
10+
console.log("navigator", navigator);
11+
console.log("navigator.mediaDevices", navigator.mediaDevices);
1212
$("#alert").hide()
1313
$("#record-contain").show();
1414
navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(function (stream) {

docker-compose-selenium.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: '2'
2+
3+
services:
4+
selenium-tests:
5+
build:
6+
context: .
7+
dockerfile: Dockerfile_selenium
8+
shm_size: 2g
9+
depends_on:
10+
- web
11+
networks:
12+
- default

tests/README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
### Юнит тесты
2+
#### Сборка и запуск проекта
3+
Собираем и запускаем проект с конфигом `config.ini` или `testing.ini`
4+
```bash
5+
$ docker compose build
6+
7+
$ APP_CONF=../app_conf/testing.ini docker compose up
8+
```
9+
10+
#### Запуск тестов
11+
Запускаем тесты следующей командой
12+
```bash
13+
$ docker exec web_speech_trainer-web-1 bash -c 'cd /project/tests && pytest --ignore=selenium'
14+
```
15+
16+
`--ignore=selenium` необходим (`pytest -s . -k 'not selenium'` не сработает), чтобы pytest не смотрел на selenium тесты, которые будут собраны в другом контейнере, иначе будут ошибки (selenium тесты будут ссылаться на отсутствующие в текущем контейнере зависимости)
17+
### Selenium тесты
18+
19+
#### Сборка и запуск проекта
20+
Сборка и запуск проекта с selenium тестами осуществляется c конфигом `testing.ini` следующим образом
21+
```bash
22+
$ docker compose -f docker-compose.yml -f docker-compose-selenium.yml build
23+
24+
$ APP_CONF=../app_conf/testing.ini docker compose -f docker-compose.yml -f docker-compose-selenium.yml up
25+
```
26+
#### Запуск тестов
27+
Чтобы запустить selenium тесты необходимо выполнить следующую команду
28+
```bash
29+
$ docker exec web_speech_trainer-selenium-tests-1 bash -c 'pytest .'
30+
```
31+
От сюда же можно запустить и юнит тесты, описанным в разделе юнит тестов способом
32+
#### Структура selenium тестов
33+
##### Selenium session
34+
Запускаемые тесты используют фикстуру `selenium_session` со `scope="module"`, объявленную в `conftest.py`. Она регистрируется в системе и возвращает экземпляр класса `SeleniumSession` с запущенным и настроенным драйвером. В нашем случае `scope="module"` значит, что для всех тестов в одном модуле будет использоваться один экземпляр `SeleniumSession` (не будет пересоздаваться от теста к тесту в одном модуле).
35+
36+
При необходимости можно объявлять другие фикстуры с другими настройками драйвера, например убрать симуляцию аудиопотока.
37+
##### Training session
38+
Класс `TrainingSession` является надстройкой над `SeleniumSession`. Можно сказать, что это API взаимодействия с любой тренировкой. Причем `SeleniumSession` может передаваться между такими надстройками, что позволяет создавать различные сценарии для тестирования.
39+
40+
Например, после завершения тренировки, использовать API для другой странички, чтобы полистать страничку со всеми тренировками и убедиться в наличии новой тренировки.
41+
##### Test Main
42+
`test_main.py` - входная точка тестирования, содержащая класс `TestMain`, который назовем сценарием тестирования. Данный класс может наследоваться от других сценариев тестирования, которые в данном контексте уже будут подсценариями. Например в `TestMain` используется подсценарий `SimpleTraining` проверяющий простую тренировку, но после тренировки можно использовать и другие подсценарии.
43+
44+
Исполнение тестов будет идти в порядке наследования, причем названия наследуемых классов не должны иметь префикс `Test`, иначе тесты могут дублироваться (вроде как принято использовать префикс `Base` для таких классов).
45+
46+
Наследование позволяет создавать различные сценарии тестирования. Каждый сценарий лучше описывать в отдельном файле вида `test_<название модуля с тестами>.py`, а их подсценарии либо в этом же файле, либо в файле без префикса `test_`, если планируется использование в других сценариях.

tests/requirements.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
pytest==8.0.2
2-
selenium==4.16.0
3-
webdriver-manager==4.0.1
2+
selenium==4.33.0

0 commit comments

Comments
 (0)