Пример расширения на Crystal и его тестирование с помощью PyTest

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 =

Теги документа