Перейти к содержанию

Тестирование#

amxpy.testing.FakeServer — сервер в памяти: тот же рантайм amxpy и тот же компилятор, но вместо движка — словари, а время виртуальное. Тест на минуту игры выполняется за миллисекунды.

tests/test_hello.py
from amxpy.testing import FakeServer


def test_heal(server: FakeServer) -> None:
    server.load("plugins/hello.py")
    admin = server.join("Admin", flags="e")
    bob = server.join("Bob", health=20)
    admin.command("amx_heal Bob 50")
    assert bob.health == 70

Фикстура server подключается сама после установки amxpy — свежий сервер на каждый тест.

Игроки#

bob = server.join("Bob", team=Team.T, money=5000, flags="t", lang="ru")
bob.say("/hp")                 # True — команда сработала и сообщение скрыто
bob.command("amx_heal Bob")    # консольная команда
bob.last_chat                  # последнее сообщение в чат без цветовых тегов
bob.chat, bob.hud, bob.dhud    # всё, что ему показали
bob.menu                       # текст меню на экране или None
bob.select(1)                  # нажать клавишу в меню
bob.disconnect()

join проводит игрока через Connect → PutInServer → Authorized (на следующем кадре). Свойства health, armor, money, frags, deaths, team, alive читают то, что сделал плагин.

Игра#

Метод Событие
server.damage(victim, 30, attacker=a) TakeDamage; возвращает урон после плагинов
server.kill(victim, killer, headshot=True) PlayerKilled
server.spawn(player) PlayerSpawn
server.round_start(), server.round_end(Winner.CT), server.freeze_end() раунд
server.buy(player, "awp", price=4750) BuyWeapon; False — плагин запретил
server.give_money(player, 300), server.drop(...), server.rename(...), server.choose_team(...) деньги, выброс, ник, команда
server.throw_grenade(...), server.plant_bomb(...), server.defuse(...), server.explode_bomb() гранаты и бомба
server.console("amxpy list") строка в консоли сервера

Время#

server.run(3.5)       # прокрутить 3,5 виртуальные секунды: таймеры, sleep, every
server.settle()       # досчитать задачи и offload(), не двигая время
server.frame()        # один кадр

Нативы, форварды, карта#

@server.amxx_native("get_user_name")             # натив AMXX для amxx.call в плагине
def get_user_name(index, name, size):
    name.value = "Bob"
    return len(name.value)

server.change_map()                              # MapEnd → загрузка плагинов → MapStart
server.pawn_forward("jb_day_start", 3, "Свободный день")   # Pawn-плагин вызвал форвард
server.native("vip_is_user_vip", bob)            # вызвать натив плагина, как это сделал бы Pawn
server.forwards                                  # форварды, отправленные в Pawn

Настройки и перезагрузка#

server.load("plugins/no_awp.py", cvars={"noawp_admins": 0})
server.set_cvar("hello_delay", 1)
assert server.reload("hello")                    # горячая перезагрузка из исходника
inst = server.plugin("hello")
assert inst.errors == 0                          # исключений в обработчиках не было

Все методы — в справочнике; готовые тесты есть у каждого примера.