Giter Club home page Giter Club logo

1testrunner's Introduction

Статус Порога Качества Покрытие Строки кода GitHub release Build Status Build status Build Status

Организовано приемочное тестирование, аналогичное тестированию 1C в проекте xUnitFor1C

Основные принципы работы с тестами для скриптов OneScript описаны в официальной документации OneScript

Использование тестирования (выдержка из документации OneScript)

Пример запуска всех приемочных тестов

Проверить все файлы текущего каталога из командной строки (с паузой, если есть упавшие тесты):

cmd /c C:\Projects\1script\tests\start-all.cmd .

Проверить все файлы текущего каталога из командной строки (без паузы, если есть упавшие тесты):

1testrunner -runall "ТекущийКаталог" xddReportPath "ТекущийКаталог"

или

cmd /c C:\Projects\1script\tests\start-all.cmd . notpause

Запуск тестов

Формат командной строки:

1testrunner [-command] testfile|testdir [test-id|test-number] [-option [optionData]]

или

oscript <каталог 1testrunner>/src/main.os [-command] testfile|testdir [test-id|test-number] [-option [optionData]]

Виды команд

  • -show - вывод доступных тестов с именами тестов и номерами тестов по порядку объявления
  • -run - прогон всех тестов из файла теста или одного конкретного теста, уточненного по номеру или наименованию
  • -runall - прогон всех тестов из каталога, в т.ч. и из вложенных каталогов

Виды режимов

  • xddReportPath - формировать отчет тестирования в формате junit-xml
    • [optionData] - полный или относительный путь к каталогу, где формировать файл *.xml

Примеры:

  • 1testrunner -show testfile - вывод списка тестов

  • 1testrunner testfile или 1testrunner -run testfile - запуск всех тестов из файла

  • 1testrunner -run testfile 5 или 1testrunner testfile 5 - запуск теста №5

  • 1testrunner -run testfile "Тест1" или 1testrunner testfile "Тест1"- запуск теста с именем Тест1

  • 1testrunner -runall tests - запуск всех тестов из каталога tests

  • 1testrunner -runall tests xddReportPath . - запуск всех тестов из каталога tests и формирование отчета тестирования в формате junit-xml

Формат скриптов-тестов

Тесты находятся в каталоге tests

Пример скрипта-теста находится в tests\example-test.os :

#Использовать asserts

Перем юТест;

// основной метод для тестирования
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт

	юТест = ЮнитТестирование;

	ВсеТесты = Новый Массив;

	ВсеТесты.Добавить("ТестДолжен_ПроверитьВерсию");

	Возврат ВсеТесты;
КонецФункции

Процедура ТестДолжен_ПроверитьВерсию() Экспорт
	Утверждения.ПроверитьРавенство("0.1", Версия());
КонецПроцедуры

Функция Версия() Экспорт
	Возврат "0.1";
КонецФункции

Механизм работы с временными файлами

В 1testrunner встроен механизм работы с временными файлами. Удобен для автосоздания и автоудаления файлов после выполнения тестов. Вызывать через юТест.

Методы:

  • ИмяВременногоФайла() - возвращается имя временного файла и имя фиксируется для дальнейшего удаления
  • УдалитьВременныеФайлы() - удаляются все зарегистрированные ранее временные файлы
    • Удобно этот метод использовать в 'ПослеЗапускаТеста'

Пример использования методов находятся в тесте temp-files.os

Запуск тестирования из Notepad++

Для прогона тестов из текущего открытого файла скрипта

в Notepad++ (в т.ч. и для плагина NppExec) можно использовать следующую команду:

cmd.exe /c C:\Projects\1script\tests\start.cmd "$(FULL_CURRENT_PATH)"

или

1testrunner -run "$(FULL_CURRENT_PATH)"

В случае ошибок в тестах/файле будет выдано окно консоли с описанием ошибки.

Пример запуска всех приемочных тестов

1testrunner -runall "$(CURRENT_DIRECTORY)"

1testrunner's People

Contributors

aliczin avatar arkuznetsov avatar artbear avatar asosnoviy avatar dmpas avatar evilbeaver avatar kuntashov avatar leemuar avatar nixel2007 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

1testrunner's Issues

Автоопределение списка тестов по ключевому слову

Для упрощения написания тестов предлагаю сделать автоматическое выполнение всех функций сценария, начинающихся с определенных ключевых слов.

Например, для файла

Процедура ТестПроверить_блабла() Экспорт
    // ...
КонецПроцедуры

Процедура ТестПроверить_ЕщеБлаБла() Экспорт
    // ...
КонецПроцедуры

Процедура Вспомогательная() Экспорт
    // ...
Процедура

Будут автоматически выполнены:

  • ТестПроверить_блабла()
  • ТестПроверить_ЕщеБлаБла()

Плюсы:

  • упрощенный способ написания тестов

Минусы:

  • невозможно составлять список нереализованных тестов

Предлагаю поддерживать оба режима тестирования, как с использованием метода ПолучитьСписокТестов(). так и без него (автозагрузка):

Если в файле есть метод ПолучитьСписокТестов() - получить список тестов из него.
Если в файле нет метода ПолучитьСписокТестов() - получить список методов, начинающихся с определенных ключевых слов, используя Рефлектор.

Нужно определиться со списком ключевых слов. Возможные варианты:

  • Тест
  • Проверить
  • Test (для поддержки зарубежных товарищей в будущем)

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

При тестировании logos на коммите 7905359efd347b7308b18caa37e7adbae0f61799 командой

1testrunner ./tests/logos-test.os

Ошибок не выдается, однако, если тестировать через таски opm

opm test

То падает один тест:

Тест №27: Тест_ДолженВывестиВЛогПростуюСтрокуСПустымПараметром

ОШИБКА: Тест: <Тест_ДолженВывестиВЛогПростуюСтрокуСПустымПараметром>
Файл: <D:\Users\ovsia\Documents\GITS\library-repos\logos\tests\logos-test.os>
Сообщение: {Модуль C:\Program Files (x86)\OneScript\lib\opm\oscript_modules\asserts\src\xunit-asserts.os / Ошибка в строке: 30 / Сравниваемые значения (ИНФОРМАЦИЯ - Привет <%1>; ИНФОРМАЦИЯ - Привет <>) не равны, а хотели, чтобы были равны.}
                ВызватьИсключение(СообщениеОшибки);

Рассогласованность в нумерации тестов

Автор - @kuntashov из #9

  • 2 Есть рассогласованность в нумерации тестов в выводе:
  • При выполнении тестов в выводе testrunner'а тесты нумеруются по порядку с нуля.
  • Если при этом запускать отдельный тест - в выводе ему будет назначен номер 0.
  • Если при выполнении всех тестовых случаев из одного файла несколько тестов, например, 2 упадут, то в выводе будет выведено:
Упали тесты. Количество 2 шт: 
    тест № 1 : ...
    тест № 2 : ...
  • Т.е. нумерация упавших - также сначала, но при этом с единицы.

  • В связи с тем, что в ком. строке поддерживается запуск теста по номеру, было бы правильнее нумерацию тестов выводить в соответствии с их порядком, в котором они добавляются в список тестов:

  • При запуске всех тестов - нумерация независимо от порядка выполнения тестов должна сохраняться согласно индексам в списке тестов

  • При выполнении одного теста должен выводиться его номер из списка тестов

  • В списке упавших тестов должны выводиться номера упавших тестов согласно списка тестов.

Лишний вызов логирования ошибки

Лог.Ошибка(ТекстВывода);

Мне кажется этот безусловный вызов логирования ошибки лишний. При запуске самотестирования в логи постоянно пишется ошибка, это напрягает.

https://files.gitter.im/EvilBeaver/oscript-library/7IAV/image.png

Есть в этом какой-то сакральный смысл или можно удалить эту строку?

Аннотации - для ночника и будущего релиза движка 1.20

  • подключение тестов, у которых задана только аннотация, и нет упоминания в ПолучитьСписокТестов:
&Тест
Процедура ПроверитьЧтоДваПлюсДваРавноЧетыре() Экспорт
      // туториалы по ТДД всегда такие простые и понятные
КонецПроцедуры
  • аннотация для исключений
// Тест будет зеленый, если выдаст исключение с заданным текстом.
// Тест будет красным в противном случае
&Тест
&ОжидаетсяИсключение("Деление на ноль")
Процедура ПроверитьЧтоДвижокВыбрасываетИсключениеДелениеНаНоль() Экспорт
        А = 1/0;
КонецПроцедуры

EPIC: Доработать тест-раннер

Продолжение https://github.com/oscript-library/1testrunner/issues/1

Продолжение EvilBeaver/oscript-library#31 и EvilBeaver/oscript-library#27

@kuntashov
Переношу значимую информацию из обсуждения https://bitbucket.org/EvilBeaver/1script/issues/207/tests-testrunneros

  • 1 Найденные баги/недочеты/фичи, которые надо учесть в новом приложении:

    • код для проверок (assertions) в testrunner.os - свой, а надо чтобы использовался модуль asserts и дублирования не было
    • то же самое про работу с ком. строкой (разбор аргументов) Перенесено в #11
    • модуль asserts/xunit отстает по возможностям от модуля asserts/bdd, в частности нет методов ВыбрасываетИсключение() и некторых других: надо привести функционал к единому виду, если сравнивать с xUnitFor1C - то от него отставание по функционалу еще больше (хотя сужу поверхностно - смотрю просто на общее количество методов-проверок, пока внимательно не анализировал, какие вообще имеет смысл переносить, очевидно, что не все);
    • Не обнаружил проверок ПроверитьСтруктурыИдентичны и ПроверитьСоответствияИдентичны или аналогичных нигде (поправьте, если ошибаюсь), даже в xUnitFor1C их не нашел. Не возникало такой потребности?
    • Если в ком. строке testrunner.os передать в качестве аргумента имя конкретного теста, но такого тестового метода пока нет (-run tests/yadisk-test.os "Тест_ЭтогоТестаНет"), то скрипт будет выполнять все методы, а ожидается, что он остановится с исключением Тестовый метод <Тест_ЭтогоТестаНет> не определен.
  • 2 Есть рассогласованность в нумерации тестов в выводе: Перенесено в #22

  • При выполнении тестов в выводе testrunner'а тесты нумеруются по порядку с нуля.

  • Если при этом запускать отдельный тест - в выводе ему будет назначен номер 0.

  • Если при выполнении всех тестовых случаев из одного файла несколько тестов, например, 2 упадут, то в выводе будет выведено:

Упали тесты. Количество 2 шт: 
    тест № 1 : ...
    тест № 2 : ...
  • Т.е. нумерация упавших - также сначала, но при этом с единицы.

  • В связи с тем, что в ком. строке поддерживается запуск теста по номеру, было бы правильнее нумерацию тестов выводить в соответствии с их порядком, в котором они добавляются в список тестов:

  • При запуске всех тестов - нумерация независимо от порядка выполнения тестов должна сохраняться согласно индексам в списке тестов

  • При выполнении одного теста должен выводиться его номер из списка тестов

  • В списке упавших тестов должны выводиться номера упавших тестов согласно списка тестов.

В случае неверного синтаксиса в файле тестов выдавать отдельный падающий тест проверки/компиляции

Тест https://github.com/EvilBeaver/OneScript/blob/develop/tests/BinaryData-global.os
в нём ошибка компиляции. Если её исправить, тогда ошибка уже в исполнении.
Притом, на build.oscript.io этот тест не помечается ни проваленным, ни пропущенным, что печально.

Это особенность реализации 1testrunner. Если он не смог скомпилить тест-файл, то он пропускается. @artbear кстати, как думаешь, каким будет правильное поведение?

Правильное поведение - указать упавшим тест компиляции этого файла.
т.е. в списке тестов должен появиться упавший тест с названием Синтакс-проверка файла BinaryData-global.os

Источник: EvilBeaver/OneScript#708 (comment)

Убрать рассогласованность в нумерации тестов

2 Есть рассогласованность в нумерации тестов в выводе:

  • При выполнении тестов в выводе testrunner'а тесты нумеруются по порядку с нуля.

  • Если при этом запускать отдельный тест - в выводе ему будет назначен номер 0.

  • Если при выполнении всех тестовых случаев из одного файла несколько тестов, например, 2 упадут, то в выводе будет выведено:

    Упали тесты. Количество 2 шт: 
        тест № 1 : ...
        тест № 2 : ...
    

Т.е. нумерация упавших - также сначала, но при этом с единицы.

В связи с тем, что в ком. строке поддерживается запуск теста по номеру, было бы правильнее нумерацию тестов выводить в соответствии с их порядком, в котором они добавляются в список тестов:

  • При запуске всех тестов - нумерация независимо от порядка выполнения тестов должна сохраняться согласно индексам в списке тестов
  • При выполнении одного теста должен выводиться его номер из списка тестов
  • В списке упавших тестов должны выводиться номера упавших тестов согласно списка тестов.

Выделено из #9

Не найден файл ... указанный в манифесте. (1.5.1)

Перестал работать тестраннер после обновления

Лог ошибки

$ sudo oscript /usr/share/oscript/lib/opm/src/opm.os install opm
ИНФОРМАЦИЯ - Скачиваю файл: opm.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет opm
ИНФОРМАЦИЯ - Устанавливаю зависимость: fs
ИНФОРМАЦИЯ - Скачиваю файл: fs-0.3.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет fs
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: asserts
ИНФОРМАЦИЯ - asserts уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: cmdline
ИНФОРМАЦИЯ - cmdline уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: tempfiles
ИНФОРМАЦИЯ - tempfiles уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: 1testrunner
ИНФОРМАЦИЯ - 1testrunner уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: gitrunner
ИНФОРМАЦИЯ - Скачиваю файл: gitrunner-1.4.0.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет gitrunner
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Регистрация приложения: opm
ИНФОРМАЦИЯ - Установка завершена
install.1
2.93s$ sudo oscript /usr/share/oscript/lib/opm/src/opm.os install 1testrunner
ИНФОРМАЦИЯ - Скачиваю файл: 1testrunner.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет 1testrunner
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: cmdline
ИНФОРМАЦИЯ - cmdline уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: tempfiles
ИНФОРМАЦИЯ - tempfiles уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: strings
ИНФОРМАЦИЯ - strings уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: 1commands
ИНФОРМАЦИЯ - Скачиваю файл: 1commands-1.3.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет 1commands
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: asserts
ИНФОРМАЦИЯ - asserts уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: tempfiles
ИНФОРМАЦИЯ - tempfiles уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: delegate
ИНФОРМАЦИЯ - Скачиваю файл: delegate-0.2.0.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет delegate
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - Скачиваю файл: logos-0.6.2.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет logos
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Регистрация приложения: 1testrunner
ИНФОРМАЦИЯ - Установка завершена
install.2
3.42s$ sudo oscript /usr/share/oscript/lib/opm/src/opm.os install 1bdd
ИНФОРМАЦИЯ - Скачиваю файл: 1bdd.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет 1bdd
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: cmdline
ИНФОРМАЦИЯ - Скачиваю файл: cmdline-0.4.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет cmdline
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: tempfiles
ИНФОРМАЦИЯ - Скачиваю файл: tempfiles-0.2.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет tempfiles
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: asserts
ИНФОРМАЦИЯ - Скачиваю файл: asserts-0.3.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет asserts
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: 1commands
ИНФОРМАЦИЯ - 1commands уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: fs
ИНФОРМАЦИЯ - fs уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: strings
ИНФОРМАЦИЯ - Скачиваю файл: strings-0.4.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет strings
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Регистрация приложения: 1bdd
ИНФОРМАЦИЯ - Установка завершена
install.3
1.91s$ sudo oscript /usr/share/oscript/lib/opm/src/opm.os install
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: delegate
ИНФОРМАЦИЯ - delegate уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: fluent
ИНФОРМАЦИЯ - Скачиваю файл: fluent.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет fluent
ИНФОРМАЦИЯ - Устанавливаю зависимость: logos
ИНФОРМАЦИЯ - logos уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: notify
ИНФОРМАЦИЯ - Скачиваю файл: notify-0.1.1.ospx
ИНФОРМАЦИЯ - Устанавливаю пакет notify
ИНФОРМАЦИЯ - Установка завершена
ИНФОРМАЦИЯ - Устанавливаю зависимость: strings
ИНФОРМАЦИЯ - strings уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Устанавливаю зависимость: tempfiles
ИНФОРМАЦИЯ - tempfiles уже установлен. Пропускаем.
ИНФОРМАЦИЯ - Установка завершена
0.82s$ oscript /usr/share/oscript/lib/opm/src/opm.os test
КРИТИЧНАЯОШИБКА - {Модуль /usr/share/oscript/lib/package-loader.os / Ошибка в строке: 59 / Не найден файл /usr/share/oscript/lib/1testrunner/src\Модули\Константы_1testrunner.os, указанный в манифесте}

Неверное поведение при указании выполнения единичного теста, которого не существует

Если в ком. строке testrunner.os передать в качестве аргумента имя конкретного теста, но такого тестового метода пока нет (-run tests/yadisk-test.os "Тест_ЭтогоТестаНет"), то скрипт будет выполнять все методы, а ожидается, что он остановится с исключением Тестовый метод <Тест_ЭтогоТестаНет> не определен.

Выделено из #9

Вывод названия выполняемых тестов по мере выполнения

Тесты могут зависать по разным причинам
в этом случае сейчас инструмент не выдает никаких помогающих сообщений
и приходится только включать отладку logos и повторно выполнять тесты

Хотелось бы видеть названия выполняющих тестов

  • перед запуском теста выводить его название
  • перед запуском тестирования файла выводить относительный\абсолютный путь файла

Такое поведение стоит отрегулировать доп.опцией командной строки --test-names

Не загружается файл тестов, если его имя содержит несколько точек

Если файл с тестовыми сценариями будет иметь в имени несколько точек, будет выведена ошибка:

Например, для файла autoload_ru_test.os.fixture

Не удалось загрузить тест \dev\oscript\1testrunner\tests\fixtures\autoload_ru_test.os.fixture
{Модуль dev\oscript\1testrunner\testrunner.os / Ошибка в строке: 333 / Неверное значение аргумента}

Проблема в использовании второго параметра ПодключитьСценарий(), его значение будет содержать точку, что недопустимо для имени типа.

1testrunner/testrunner.os

Lines 327 to 333 in 206da3f

ПолноеИмяТестовогоСлучая = Файл.ПолноеИмя;
ИмяКлассаТеста = СтрЗаменить(Файл.ИмяБезРасширения,"-","")+СтрЗаменить(Строка(Новый УникальныйИдентификатор),"-","");
Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда
Сообщить(" Файл теста "+ПолноеИмяТестовогоСлучая);
КонецЕсли;
Попытка
ПодключитьСценарий(Файл.ПолноеИмя, ИмяКлассаТеста);

Ошибка запуска обычного тестирования в 1.4.2

При запуске обычного тестирования сторонних скриптов через 1testrunner выдается ошибка

{Модуль C:\Program Files (x86)\OneScript\lib\1testrunner\main.os / Ошибка в строке: 0 / 
Ошибка загрузки библиотеки C:\Program Files (x86)\OneScript\lib\1testrunner. 
Обнаружены циклические зависимости}

Исходная ошибка oscript-library/v8runner#27

#Использовать 1testrunner

Сабж. Как?
Сейчас тестраннер жрет аргументы командной строки даже в файле, в котором есть только она директива Использовать и пытается сразу запуститься

Ошибка в работе с делегатами, ПередЗапускомТеста() вызывается с параметром Неопределено

Текущая версия мастер-ветки (154e5a5) не проходит собственные же тесты:

https://imgur.com/UwAdxGo

Судя по всему ПередЗапускомТеста() вызывается делегатом с одним параметром, равным Неопределено, что приводит к ошибке "Неверное количество параметров"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.