HtmlBuilder имеет поддержку расширений, посмотрим как написать простейший модуль на языке Crystal и протестируем его в pytest Начнем с установки компилятора
sudo pacman -S crystal shardsЗатем создадим исполняемый файл Crystal, который откроет файл youtube.inp , в котором будет id ролика, и создаст файл youtube.out, в котором будет лежать html разметка для плеера
# ВХОДНОЙ ФАЙЛ ИМЕЕТ ИМЯ МОДУЛЬ.inp path_source = "youtube.inp" # у выходного .out path_dest = "youtube.out" # создаем указатель на файл источник input_file = File.new path_source, "r" # считываем контент youtube_id = File.read path_source # шаблон плеера template = "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/test-crystal-bin-using-pytest\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>" # делаем замену html = template.sub("test-crystal-bin-using-pytest",youtube_id) # по смыслу это ID ролика # открываем указатель на запись File.write( path_dest, html) input_file.closeТеперь расширение надо скомпилировать. Сохраним исходный код в youtube.cr
crystal build youtube.cr
В каталоге появится файл youtube, который можно запустить из консоли ./youtube
Установим с помощью pip pytest для прогона тестов
pip install pytest
Следующим шагом является написание теста на Python
import subprocess def test_youtube(): example_input = open("youtube.inp", "w") example_input.write("8jed0wIQv_A") example_input.close() subprocess.run(["/home/artem/youtube-crystal/youtube", ""]); example_output = open("youtube.out", "r"); # ожидаем expected = """<iframe width="560" height="315" src="https://www.youtube.com/embed/8jed0wIQv_A" title="YouTube video player" frameborder="0" allow="ac celerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>\n""" # считываем html = example_output.read() example_output.close # сравнили assert html == expectedИдея теста простая - подготовим входные данные, вызовем внешнюю программу, затем сравним ожидаемый результат с эталоном Сохраним файл под именем test_youtube.py. Запустим тест с помощью pytest pytest test_youtube.py Результат показывает, что модуль прошел тестирование
= test session starts =
platform linux -- Python 3.10.7, pytest-7.2.0, pluggy-1.0.0
plugins: anyio-3.6.1
collected 1 item
test_youtube.py . [100%]
= 1 passed in 0.04s =
Теги документа