Мониторинг производительности и покрытие кода тестирования Go

Go

1. Запись тестового запуска

С точки зрения аппаратной среды, он в основном исследуетсостояние нагрузки,Напримериспользование процессора,использование памяти,использование дискаЖдать.
С точки зрения программных систем, в основном включаютвыделение памяти,Количество одновременной обработкиа такжетупики т.п.

(1) Сбор данных об использовании ресурсов

Флаги, связанные со сбором данных об использовании ресурсов

название тэга описание тега
-cpuprofile cpu.out Использование ЦП записывается и записывается в указанный файл до завершения теста.
cpu.out как имя файла указанного файла можно заменить любым другим именем
-memprofile mem.out Записывает использование памяти и записывает сводку использования памяти в указанный файл после прохождения всех тестов.
mem.out как имя файла указанного файла можно заменить любым другим именем
-memprofilerate n Этот флаг управляет поведением журналирования операций выделения памяти, которые будут записаны в профиль использования памяти.
N представляет интервал выборки анализатора в байтах. Профилировщик делает выборку каждый раз, когда выделяется n байтов памяти.

выполнить сейчас-cpuprofileотмеченgo testкоманда для запуска стандартной библиотекиnetТесты в пакетах кода. Например:

E:\Software\Go\goc2p\pprof>go test -cpuprofile cpu.out net

go testКомандные программы нельзя использовать при тестировании нескольких пакетов кода.-cpuprofileотмечены следующим образом:

这里写图片描述

После завершения вышеуказанного тестового запуска в текущем каталоге создаетсяnet.test.exeИсполняемые файлы иcpu.outфайл, вы можете использоватьgo tool pprofкоманда для интерактивного обращения к этому профилю следующим образом:

这里写图片描述

когда-memprofileКогда флаг установлен, исполнители тестов записывают использование своей памяти (выделение памяти кучи во время выполнения программы) во время выполнения тестов.

использовать-memprofilerateФлаг для установки интервала выборки анализатора в байтах. Меньшее значение означает более качественную выборку, поскольку интервал выборки будет короче. существуетtestingвнутри сумки,-memprofilerateЗначение тега будет присвоеноruntimeв упаковкеintпеременная типаMemProfileRate, значение этой переменной по умолчанию равно512 * 1024,Прямо сейчас512Kбайт. Если установлено0, затем представляетостановить выборку.

-memprofileотметьте и-memprofilerateПомеченный оператор тестовой команды выглядит следующим образом:
E:\Software\Go\goc2p\pprof>go test -memprofile mem.out -memprofilerate 10 net

После выполнения вышеуказанной команды в текущем каталоге создается файлnet.test.exeисполняемый файл иcpu.outфайл, вы можете использоватьgo tool pprofкоманда для интерактивного обращения к этому профилю следующим образом:

这里写图片描述

(2) Запись событий блокировки программы

Флаги, связанные с протоколированием событий блокировки программы

название тэга описание тега
-blockprofile block.out Регистрирует события блокировки Goroutine и записывает сводную информацию в указанный файл после прохождения всех тестов.
block.out как имя файла указанного файла можно заменить любым другим именем
-blockprofilerate n Этот флаг используется для управления временным интервалом для записи событий блокировки Goroutine.Единицей n является время.Значение по умолчанию равно 1.

-blockprofileа также-blockprofilerateПомеченный оператор тестовой команды выглядит следующим образом:
E:\Software\Go\goc2p\pprof>go test -blockprofile block.out -blockprofilerate 100 net

-blockprofilerateЗначение тега также передается через пакет кода стандартной библиотеки.runtimeсерединаAPI--функцияSetBlockProfileRate-- Передано системе выполнения Go. Когда входящий параметр0эквивалентно полной отмене операции записи. Когда входящий параметр1, каждое событие блокировки будет зарегистрировано.-blockprofilerateЗначение тега по умолчанию равно1.

 

2. Тестовое покрытие

Покрытие тестом относится к тому, какая часть кода в пакете кода, который является тестируемым объектом, используется в только что выполненном тесте. Если тест выполняется так, что выполняются 90 % операторов в текущем пакете кода, то покрытие теста тестом составляет 90 %.

go testДопустимые флаги команды, связанные с тестовым покрытием

название тэга Пример использования иллюстрировать
-cover -cover Включить анализ тестового покрытия
-covermode -covermode=set добавить автоматически-coverОтметьте и установите различные режимы статистики тестового покрытия.Поддерживаются следующие режимы.
set: только записывает, был ли оператор выполнен
count: запишите, сколько раз оператор был выполнен
atomic: запишите, сколько раз выполняется оператор, и убедитесь, что его можно правильно подсчитать при параллельном выполнении, но это в определенной степени повлияет на производительность.
Эти режимы нельзя использовать одновременно, по умолчанию используется статистический режим тестового покрытия.set
-coverpkg -coverpkg bufio,net добавить автоматически-coverОтметьте и выполните статистику тестового покрытия для программ в пакете кода, указанном после отметки.
По умолчанию средство выполнения тестов будет учитывать только те программы в пакете кода, который непосредственно тестируется.
Этот флаг означает, что программы в других пакетах кода, которые косвенно используются в тесте, также могут быть учтены.
Кроме того, пакет кода должен быть указан путем импорта, а несколько путей импорта разделяются запятыми ",".
-coverprofile -coverprofile cover.out добавить автоматически-coverОтметить и записать сводку покрытия всех пройденных тестов в указанный файл

существуетgo testдобавить после команды-coverОтметьте, чтобы включить статистику тестового покрытия. следующим образом:

这里写图片描述

отметка-coverpkgСкорость выполнения программ в косвенно используемом пакете кода во время теста может быть получена. следующим образом:

这里写图片描述

В использовании-coverpkgПосле маркировки для указания пакета кода, который необходимо учитывать, неуказанный код определенно не будет учитываться, даже пакет кода, который непосредственно тестируется.

отметка-coverprofileЗаставляет средство выполнения тестов записывать статистику покрытия тестами в указанный файл. Файл будет помещен в исполнениеgo testв каталоге, где была выполнена команда. следующим образом:

这里写图片描述

дляcover.outКонтент может быть предоставлен с использованием языка Gocoverвид инструмента, черезgo tool coverкоманда для его запуска.coverДве функции инструмента:

  1. Перепишите код в исходном файле в соответствии с указанными правилами и выведите его в указанную цель.

  2. Прочитайте файл статистики тестового покрытия и представьте его в указанном виде.

Для первой функции запуститеgo testПосле команды программа запуска теста используетcoverИнструмент перезаписывает нетестовые исходные файлы в тестируемом пакете перед их компиляцией. Способ перезаписи будет запускатьсяgo testпо команде-covermodeОпределяет режим статистики тестового покрытия, указанный флагом. По умолчанию этот статистический режимset.

установить режим статистики

существуетtesting/ctНиже приведены следующие файлы исходного кодаct_demo.go,следующим образом:

package ct
 
func TypeCategoryOf(v interface{}) string {
    switch v.(type) {
    case bool:
        return "boolean"
    case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
        return "integer"
    case float32, float64:
        return "float"
    case complex64, complex128:
        return "complex"
    case string:
        return "string"
    }
    return "unknown"//如果只是非基本类型,统一返回“unknown”
}

Бегпройти тест --coverПосле команды тестовый бегунcoverинструмент будетTypeCategoryOfФункция переписывается следующим образом:

func TypeCategoryOf(v interface{}) string {
    GoCover.Count[0] = 1
    switch v.(type) {
    case bool:
        GoCover.Count[2] = 1
        return "boolean"
    case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
        GoCover.Count[3] = 1
        return "integer"
    case float32, float64:
        GoCover.Count[4] = 1
        return "float"
    case complex64, complex128:
        GoCover.Count[5] = 1
        return "complex"
    case string:
        GoCover.Count[6] = 1
        return "string"
    }
    GoCover.Count[1] = 1
    return "unknown"
}

Счетчик вставляется в каждую ветвь процесса в исходном исходном коде (путемGoCover.Countпредставлять). Всякий раз, когда выполняется ветвь процесса, соответствующий счетчик назначается как1, этот способ может только указать, была ли выполнена ветвь.

ПеременнаяGoCoverПредставляет значение типа анонимной структуры, его значение используется для хранения значения счетчика каждой ветви, количества строк в текущем исходном файле в начальной и конечной позиции каждой ветви, а также количества операторов в каждой ветви и другой информации. . ПеременнаяGoCoverНа данный момент ее можно назвать переменной счетчика выполнений, и ее имя-varотметить, чтобы сообщитьcoverинструмент.

go testТестовой целью команды может быть один или несколько пакетов кода, в то время какcoverИнструмент может перезаписывать только один исходный файл за раз. Если тестируется несколько файлов исходного кода, тоgo testКоманда будет запущена один раз для каждого файлаcoverинструмент. Чтобы имя переменной счетчика выполнения не повторялось в каждом перезаписываемом файле исходного кода,go testкоманда для разных исходных файлов, переданных вcoverинструмент-varЗначение тега также отличается.

режим подсчета статистики

существуетsetСледующий оператор в статистическом режиме:

GoCover.Count[0] = 1

будет написано как

GoCover.Count[0]  

Это эквивалентно протоколированию каждого выполнения ветки.

режим атомарной статистики

setОператор в статистическом режиме будет записан следующим образом:

_cover_atomic_.AddUint32(&CoverVar.Count[1], 1)

вcover_atomicэто пакет кодаsync/atomicalias, вам необходимо импортировать в исходный код следующий оператор:

import _cover_atomic_ "sync/atomic"

atomicСтатистический режим обычно используется только в сценариях приложений с параллельным выполнением, поскольку выполнение атомарных операций приведет к определенной потере производительности. а такжеsetа такжеcountСтатистические закономерности гораздо более общие, и они гораздо меньше влияют на стоимость выполнения исходной программы.

пройти через-modeФлаг передает режим статистики тестового покрытия для использования непосредственно вcoverинструмент. Его использование и значение такие же, какgo testкоманда-covermodeОтметьте же. Фактически,go testкоманда будет-covermodeОтмеченное значение запускается как естьcoverинструменты переданы ему-modeЗначение тега. но,-modeТег не имеет значения по умолчанию, поэтому используйтеcoverКогда инструмент перезаписывает файл исходного кода, его необходимо добавить-modeотметка.

По умолчанию переписанный исходный код выводится на стандартный вывод. Но вы также можете использовать-oТег хранит код в указанном файле.

Используйте следующим образомcoverинструмент-рабочее пространствоsrcв каталогеtesting\ctпод пакет кодовct_demo.goЧтобы переписать:

E:\Software\Go\goc2p\src\testing\ct>go tool cover -mode=set -var=”GoCover” -o ct _out.go ct_demo.go

В настоящее времяct_out.goто естьct_demo.goВы можете запустить и просмотреть переписанный файл исходного кода самостоятельно.

дляcoverВторая функция инструмента:
Посмотреть доgo test cnet/ctcp -coverprofile=cover.outКомандаcnet/ctcpПакет кода создает профиль тестового покрытия.cover.out, запустите скриншот следующим образом:

这里写图片描述

отметка-funcможет позволитьcoverИнструмент выводит на стандартный вывод сводную информацию о покрытии тестами для каждой функции, содержащейся в профиле.

В приведенном выше выводе, за исключением последней строки, каждая строка содержит 3 части информации, а именно: относительный путь к файлу исходного кода, в котором находится функция, имя функции и количество проверенных операторов в функции с учетом Процент от общего количества операторов для функции. Процент в последней строке — это процентное соотношение всех проверенных операторов в тестируемом пакете кода к общему количеству операторов в пакете кода.

используй сейчас-htmlМаркер, вы можете увидеть больше графической информации, чтобы интуитивно отражать статистику. следующим образом:

go tool cover -html=cover.out

Команда немедленно возвращается, и в стандартном выводе ничего не появляется. Вместо этого будет запущен и отображен браузер по умолчанию текущей операционной системы.coverИнструмент только что был сгенерирован из профиляHTMLформатированный файл подкачки. следующим образом:

这里写图片描述

в этотHTMLНа странице проверенные операторы отображаются зеленым цветом, непроверенные операторы — красным, а операторы, не участвовавшие в расчете тестового покрытия, — серым. В верхнем левом углу вы также можете выбрать различные файлы исходного кода в тестируемом пакете кода в раскрывающемся списке, чтобы просмотреть их тестовое покрытие. При наведении курсора мыши на зеленую инструкцию рядом с курсором появится количество раз выполнения инструкции Вы можете попробовать сами.

надHTMLФайл подкачки показываетsetПрофили, созданные в статистическом режиме. существуетcountа такжеatomicВ статистическом режиме вы можете попробовать сами, обратитесь к следующему:

这里写图片描述

допустимая маркировка инструментов для покрытия

название тэга Пример использования иллюстрировать
-func -func=cover.out В соответствии с содержимым файла профиля (например, cover.out) выведите сводную информацию о тестовом покрытии каждой тестируемой функции.
-html -html=cover.out Преобразуйте содержимое профиля в файл в формате HTML и просматривайте его с помощью веб-браузера по умолчанию в текущей операционной системе.
-mode -mode=count Используется для установки режима статистики тестового профиля, см. флаг -covermode команды go test.
-o -o=cover.out Выводить переписанный исходный код в указанный файл, если этот флаг не установлен, переписанный исходный код будет выводиться на стандартный вывод
-var -var=GoCover Задает имена дополнительных переменных, добавленных в исходный исходный код.

 

 

 

 

Ссылка на ссылку:

blog.CSDN.net/U012855229/…