2017-02-20 26 views
4

Есть ли способ ограничить объем использования/роста памяти во время модульного теста в golang?Как я могу ограничить использование памяти затвора в блоке test test

Например, в Java, мы можем сделать:

long before = Runtime.getRuntime().freeMemory() 

// allocate a bunch of memory 
long after = Runtime.getRuntime().freeMemory() 

Assert.AssertTrue(before-after < 100) 

(примерно), чтобы утверждать, что мы не использовали более 100 байт.

+0

Используйте -benchmem флаг (и некоторые тесты). Что-то вроде «свободной памяти» не является подходящей метрикой в ​​Go, поэтому вы не сможете сделать то же самое. – Volker

ответ

4

Используйте тесты Go для анализа использования памяти. Например:

mem.go:

package mem 

func memUse() { 
    var stack [1024]byte 
    heap := make([]byte, 64*1024) 
    _, _ = stack, heap 
} 

mem_test.go:

package mem 

import "testing" 

func BenchmarkMemUse(b *testing.B) { 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     memUse() 
    } 
    b.StopTimer() 
} 

Выход:

$ go test -bench=. 
goos: linux 
goarch: amd64 
pkg: mem 
BenchmarkMemUse-4  200000  8188 ns/op  65536 B/op  1 allocs/op 
PASS 
ok  mem 1.745s 

memUse функция делает одно распределение кучи 65536 (64 * 1024) байт. Распределения стека дешевы и локальны для функции, поэтому мы не учитываем их.

Вместо метода ReportAllocs вы можете использовать флаг -benchmem. Например,

go test -bench=. -benchmem 

Ссылки:

Go: Package testing: Benchmarks

Command go: Description of testing functions

Command go: Description of testing flags


Если вы действительно должны применить ограничение памяти во время Go testing пакет Test функц ион, попробуйте использовать runtime.MemStats. Например,

func TestMemUse(t *testing.T) { 
    defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) 
    var start, end runtime.MemStats 
    runtime.GC() 
    runtime.ReadMemStats(&start) 
    memUse() 
    runtime.ReadMemStats(&end) 
    alloc := end.TotalAlloc - start.TotalAlloc 
    limit := uint64(64 * 1000) 
    if alloc > limit { 
     t.Error("memUse:", "allocated", alloc, "limit", limit) 
    } 
} 

Выход:

$ go test 
--- FAIL: TestMemUse (0.00s) 
    mem_test.go:18: memUse: allocated 65536 limit 64000 
FAIL 
exit status 1 
FAIL mem 0.003s