Тесты Gikngo зависают во время тестов goapp

Я пытаюсь использовать Gikngo для написания тестов для appengine.

Мои настройки для тестов следующие:

suite_test.go:

BeforeSuite() {
  inst, err = aetest.NewInstance(options)
  if err != nil {
    Fail(fmt.Sprintf("%s", err))
  }
}

var(
  req *http.Request
  ctx context.Context
)
BeforeEach() {
  req = inst.NewRequest()
  ctx = appengine.NewContext(req)

  // Clean up local datastore using the context.
}

validation_test.go

Describe("Some Test", func() {
  It("ValidateFoo", func() {
    // Access ctx here
  })
  ...
  It("ValidateBar", func() {
    // Access ctx here.
  })
})

Вижу наши тесты стабильно зависают с ошибкой типа:

Expected success, but got an error:
    <*url.Error | 0xc8210570b0>: {
        Op: "Post",
        URL: "http://localhost:59072",
        Err: {s: "EOF"},
    }
    Post http://localhost:59072: EOF

Похоже, это указывает на то, что сервер API стал недоступным. Однако результаты теста, похоже, не указывают на это.

Какими способами мы можем отладить тест goapp?


person Shaunak Godbole    schedule 06.05.2017    source источник


Ответы (1)


Оказывается, Гинкго или Голанг тут ни при чем. Кажется, существует некоторое ограничение на количество полей, которые можно прочитать в секунду из dev_appserver.py. (Я подозреваю, что это может быть связано с SQLite, который является БД, которую dev_appserver использует внутри).

Следующий код указывает на проблему:

package preorder

import (
    "fmt"
    "testing"

    "google.golang.org/appengine"
    "google.golang.org/appengine/aetest"
    "google.golang.org/appengine/datastore"
)

func TestLoad(t *testing.T) {
    opts := aetest.Options{StronglyConsistentDatastore: true}
    inst, _ := aetest.NewInstance(&opts)
    defer inst.Close()

    for i := 0; i < 10000; i++ {
        req, _ := inst.NewRequest("GET", "/", nil)
        ctx := appengine.NewContext(req)

        k := datastore.NewKey(ctx, ENTITY_NAME, "", 12345, nil)
        var entity Entity
        datastore.Get(ctx, k, &entity)
        fmt.Println("Iteration Count: ", i)
        ctx.Done()
    }
}

Будем признательны за любую помощь в выяснении того, как обойти ограничение в 240 операций. Один из способов, который я могу придумать, — это искусственное введение задержек.

person Shaunak Godbole    schedule 09.05.2017