mercredi 14 mars 2018

Is it fine to have logging in golang test? Or is it a practice to not have logging in test?

Is it fine to have logging in golang test? Or is it a practice to not have logging in test?

My test currently looks something like this. I am not sure if I am doing it right and is need of advise for the best practice to do test in golang. This is an integration test btw.

var testDB *DB

func clearTable(name string) {
        var err error
        _, err = testDB.Exec(fmt.Sprintf("DELETE FROM %s", name))
        if err != nil {
                log.Fatalf("[FATA] Failed to clear a table in database. name=%q err=%q", name, err)
        }
        _, err = testDB.Exec(fmt.Sprintf("ALTER SEQUENCE %s_id_seq RESTART WITH 1", name))
        if err != nil {
                log.Fatalf("[FATA] Failed to reset ID sequence of a table in database. name=%q err=%q", name, err)
        }
}

func TestMain(m *testing.M) {
        var err error
        testDB, err = NewDB(fmt.Sprintf("dbname=%s sslmode=disable", testDBName))
        if err != nil {
                log.Fatalf("[FATA] Failed to initialize test database. dbName=%q err=%q", testDBName, err)
        }
        defer testDB.Close()
        code := m.Run()
        clearTable("worker")
        os.Exit(code)
}

func TestCreateWorker(t *testing.T) {
        clearTable("worker")

        createdWorkers := make(map[int]*Worker, 10)
        for i := 0; i < 10; i++ {
                username := strings.Join([]string{"worker", strconv.Itoa(i)}, "")
                email := strings.Join([]string{username, "@gmail.com"}, "")
                passwordHash := strings.Join([]string{username, "PasswordHash"}, "")
                worker := Worker {
                        Username: username, 
                        Email: email,
                        PasswordHash: passwordHash,
                }
                err := testDB.CreateWorker(&worker)
                if err != nil {
                        t.Errorf("[ERRO] Failed to create a new worker in database. username=%q email=%q passwordHash=%q err=%q", username, email, passwordHash, err)
                }
                createdWorkers[i+1] = &worker
        }

        rows, err := testDB.Query("SELECT * FROM worker")
        if err != nil {
                t.Errorf("[ERRO] Failed to get all workers from database. err=%q", err)
        }
        defer rows.Close()
        for rows.Next() {
                returnedWorker := new(Worker)
                err := rows.Scan(&returnedWorker.ID, &returnedWorker.Username, &returnedWorker.Email, &returnedWorker.PasswordHash, &returnedWorker.CreatedAt)
                if err != nil {
                        t.Errorf("[ERRO] Failed to scan returned row into worker struct. err=%q", err)
                }
                createdWorker := createdWorkers[returnedWorker.ID]
                if !reflect.DeepEqual(&createdWorker, &returnedWorker) {
                        t.Errorf("[ERRO] Worker created in database and worker returned from database are different. createdWorker=%v returnedWorker=%v", createdWorker, returnedWorker)
                }
        }
}

Aucun commentaire:

Enregistrer un commentaire