Robię testy jednostkowe na moim apisie odpoczynku z Mochą i Chai. Na razie, dla każdego wniosku (powiedzmy na przykład post) przetestuję całe ciało odpowiedzi (z wyłączeniem danych nie statycznych, takich jak IDS itp.). Problemem jest: Jeśli pewnego dnia zdecyduję się zmienić model mojego zasobu, jak może dodanie nowego pola. Rzeczywiste testy nie sprawdzą tego nowego pola. Więc będę musiał zaktualizować każdy test związany z tym zasobem, który może być skomplikowany, ponieważ liczba testów wzrasta.

Więc moje pytanie brzmi: czy robię to we właściwy sposób? Jeśli nie, co powinienem przetestować w moich odpowiedziach API i czego nie powinienem?

2
FantzFoXx 28 listopad 2019, 16:59

1 odpowiedź

Najlepsza odpowiedź

Suche (nie powtarzaj się) zasada dotyczy testowania, ale nie 't go przeźdź. Testy powinny być "wilgoć nie suche".

... Jeśli pewnego dnia zdecyduję się zmienić model mojego zasobu, jak może dodanie nowego pola. Rzeczywiste testy nie sprawdzą tego nowego pola. Więc będę musiał zaktualizować każdy test związany z tym zasobem ...

W tym przypadku, co zwykle robię, to stworzyć Chai Custom Asertion definiuje zestaw asercji Dla określonego typu, np. Todo.

To stwierdzenie niestandardowe jest wtedy (RE) używane we wszystkich odpowiednich testach, aby sprawdzić, czy zwrócony obiekt faktycznie przekazuje twierdzenia dla Todo, bez konieczności powtarzania tych samych twierdzeń w każdym teście.

Oto przykład:

const chai = require('chai')
const chaiHttp = require('chai-http')
const server = 'https://jsonplaceholder.typicode.com'

chai.should()
chai.use(chaiHttp)
// Define a custom assertion for 'Todo'. We expect that a Todo always 
// has an `id` property of type `Number` and a `title` property of
// type `String`.
chai.use((chai, utils) => {
  utils.addProperty(chai.Assertion.prototype, 'Todo', function () {
    this._obj.should.have.property('id')
    this._obj.should.have.property('title')

    this._obj.id.should.be.a('Number')
    this._obj.title.should.be.a('String')
  })
})

// Begin Tests

describe('Retrieve a Todo', () => {
  it('returns a single Todo by ID', () => {
    return chai.request(server)
      .get('/todos/1')
      .then(res => {
        res.should.have.status(200)
        // Use the custom assertion to check if returned object
        // passes the assertions for `Todo`.
        res.body.should.be.a.Todo
      })
  })
})

describe('Retrieve all Todos', () => {
  it('returns a list containing 200 Todos', () => {
    return chai.request(server)
      .get('/todos')
      .then(res => {
        res.should.have.status(200)
        res.body.should.be.an('Array')
        res.body.should.have.length(200)
        // Reuse the custom assertion to check if all returned objects
        // pass the assertions for `Todo`.
        res.body.forEach(todo => todo.should.be.a.Todo)
      })
  })
})

Jeśli w przyszłości dodam nowe pole na Todo, I.E completed, wszystko, co muszę zrobić, to modyfikować stwierdzenie niestandardowe jak:

chai.use((chai, utils) => {
  utils.addProperty(chai.Assertion.prototype, 'Todo', function () {
    this._obj.should.have.property('id')
    this._obj.should.have.property('title')
    this._obj.should.have.property('completed')

    this._obj.id.should.be.a('Number')
    this._obj.title.should.be.a('String')
    this._obj.completed.should.be.a('Boolean')
  })
})

... Co powinienem przetestować w odpowiedziach API i czego nie powinienem?

Jako minimum sprawdziłbym, czy:

  • Odpowiedź Status HTTP jest poprawny.
  • Korpus odpowiedzi ma odpowiednie właściwości i prawidłowe typy dla każdej nieruchomości.
  • Jeśli odpowiedź jest lista przedmiotów, sprawdziłbym, czy ciało odpowiedzi jest rzeczywiście Array, jeśli ma length spodziewam się, że ma i jeśli każdy element w Array ma prawidłowe właściwości i typy.

Nie ma tutaj "zasad". Na koniec jest to decyzja o ryzyku / czasie. Utrzymanie pakietu testowego wymaga czasu. Jeśli buduję prostą aplikację TOODY na własny użytek, nie będę zbyt wiele z wyczerpującymi testami. Jeśli jednak buduję publiczny serwer płatności, na pewno chcę, aby moje testy były jak najmniej wyczerpujące.

2
nicholaswmin 29 listopad 2019, 10:23