Скука и рутина это зло

run{}

Постоянный прогон тестов для Go

Понадобилась мне небольшая тулза, которая бы перезапускала тесты при изменениях кода, а также уведомляла об ошибках. Проще говоря мне нужено что-то вроде autotest для Rails или watchr.

Накидал небольшой код который мониторит все *.go файлы и запускает тексты. Использовал последний свежий Go из репозитория. Использовал команду notify-send для системных уведомлений, гарантированно работает на Ubuntu Oneric 11.10. Если есть у кого желание, то можно форкнуть gist и добавить функции системного уведомления для вашей системы.

package main

import "log"
import "os"
import "regexp"
import "os/exec"
import "exp/inotify"

func runTests() {
    cmd := exec.Command("go", "test")
    cmd.Stdout = os.Stdout
    if err := cmd.Run(); err != nil {
        log.Println(err)
        notifySystem("go test failed")
    }
}

// probably will work only for Ubuntu
func notifySystem(message string) {
    cmd := exec.Command("notify-send", message)
    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }
}

func setupWatcher() *inotify.Watcher {
    watcher, err := inotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }

    err = watcher.AddWatch(".", inotify.IN_MODIFY)
    if err != nil {
        log.Fatal(err)
    }

    return watcher
}

func main() {
    watcher := setupWatcher()

    runTests()
    for {
        select {
        case ev := <-watcher.Event:
            matched, err := regexp.MatchString(".*\\.go", ev.Name)
            if err != nil {
                log.Fatal(err)
            }

            if matched {
                // On my machine it always raised two events
                // ignore second, prevent twice tests run.
                // Probably it's depends of test editor.
                // If so, feel free to
                // remove line above:
                <-watcher.Event

                runTests()
            }
        case err := <-watcher.Error:
            log.Println("error:", err)
        }
    }
}

UPD: Теперь watcher живёт по адресу: https://bitbucket.org/vladimir_vg/go-retest. Подробнее в следующем посте.

Comments