Здравейте на всички. Днес споделяме с вас финалната част на статията , преводът на която е подготвен специално за студентите от курса .

Тестване на внедряването
Разгледаният стил на тестване е мощен подход, който ни позволява да извършваме тестване на бял ящик за проверка на вътрешните механизми на нашия инфраструктурен код. Въпреки това, той малко ограничава това, което можем да проверим. Тестовете се изпълняват на основата на in-memory план за внедряване, генериран от Pulumi преди самото внедряване, поради което самото внедряване не може да бъде тествано. За тези случаи Pulumi предлага фреймворк за интеграционни тестове. И тези два подхода работят чудесно заедно!
Фреймворкът за интеграционно тестване на Pulumi е написан на Go, и именно с него тестваме по-голямата част от нашия вътрешен код. Докато разгледаният по-рано подход на модулно тестване наподобяваше тестване на бял ящик, интеграционното тестване е тестване на черен ящик. (Има също и варианти за задълбочено вътрешно тестване.) Този фреймворк е създаден, за да вземе цялата Pulumi-програма и да изпълни различни операции в жизнения цикъл, като внедряване на нов стек от нулата, неговото обновление с вариации и изтриване, всичко това, вероятно, многократно. Ние ги стартираме редовно (например, през нощта) и като стрес тестове.
(Ние , за да има подобни възможности за интеграционно тестване в родното SDK на езици. Можете да използвате фреймворка за интеграционно тестване на Go независимо от езика, на който е написана вашата Pulumi-програма).
Стартирайки програмата с помощта на този фреймворк, можете да проверите следното:
- Кодът на вашия проект е синтактично правилен и работи без грешки.
- Настройките на конфигурацията на стека и секретите работят и се интерпретират правилно.
- Вашият проект може успешно да бъде внедрен в избрания от вас облачен доставчик.
- Вашият проект може успешно да бъде обновен от началното състояние до N други състояния.
- Вашият проект може успешно да бъде унищожен и изтрит от вашия облачен доставчик.
Както скоро ще видим, този фреймворк може да се използва също и за изпълнение на runtime валидация.
Прост тест за интеграция
За да видим това в действие, ще погледнем репозитория pulumi/examples, тъй като нашият екип и общността на Pulumi го използват за тестване на собствени пул реквести, комити и нощни сборки.
По-долу е опростен тест на нашия :
example_test.go:
package test
import (
"os"
"path"
"testing"
"github.com/pulumi/pulumi/pkg/testing/integration"
)
func TestExamples(t *testing.T) {
awsRegion := os.Getenv("AWS_REGION")
if awsRegion == "" {
awsRegion = "us-west-1"
}
cwd, _ := os.Getwd()
integration.ProgramTest(t, &integration.ProgramTestOptions{
Quick: true,
SkipRefresh: true,
Dir: path.Join(cwd, "..", "..", "aws-js-s3-folder"),
Config: map[string]string{
"aws:region": awsRegion,
},
})
} Тестът преминава през основния жизнен цикъл на създаване, промяна и унищожаване на стек за папката aws-js-s3-folder. Отнема около минута, за да съобщи за преминат тест:
$ go test .
PASS
ok ... 43.993s Има много опции за настройка на поведението на тези тестове. Полният списък с опции вижте ProgramTestOptions. Например, можете да конфигурирате Jaeger endpoint за трасировка (Tracing), да зададете, че очаквате тестът да се провали при негативно тестване (ExpectFailure), да приложите серия от "корекции" към програмата за последователно преминаване между състояния (EditDirs) и много повече. Нека видим как да ги използваме за тестване на разгръщането на приложението.
Проверка на свойствата на ресурсите
Интеграцията, за която говорихме по-горе, гарантира, че нашата програма "работи" — тя не се проваля. Но какво, ако искаме да проверим свойствата на получения стек? Например, дали определени видове ресурси са били (или не са били) подготвени и имат определени атрибути.
Параметър ExtraRuntimeValidation за ProgramTestOptions ни позволява да разгледаме състоянието, фиксирано от Pulumi след разгръщането (post-deployment state), за да можем да направим допълнителни проверки. Тук влизат пълен моментен образ на състоянието на резултатния стек, включително конфигурация, експортирани изходни стойности, всички ресурси и стойности на техните свойства, както и всички зависимости между ресурсите.
За да видим основен пример за това, да проверим, че нашата програма създава един S3 Bucket:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// както преди...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
var foundBuckets int
for _, res := range stack.Deployment.Resources {
if res.Type == "aws:s3/bucket:Bucket" {
foundBuckets++
}
}
assert.Equal(t, 1, foundBuckets, "Очаква се да се намери един единствен AWS S3 Bucket")
},
})Сега, когато стартираме go test, той не само ще премине през редица тестове за жизнен цикъл, но и след успешното разгръщане на стека ще извърши допълнителна проверка на резултатното състояние.
Тестове в реално време
До този момент всички тестове се фокусираха единствено върху поведението при разгръщане и модела на ресурсите на Pulumi. Какво да направим, ако искаме да проверим дали подготвената ни инфраструктура наистина работи? Например, дали виртуалната машина работи, S3 bucket съдържа това, което очакваме и така нататък.
Може би вече сте се досетили как да го направите: опцията ExtraRuntimeValidation за ProgramTestOptions е отлична възможност за това. На този етап стартирате произволен тест Go с достъп до цялото състояние на ресурсите на вашата програма. Това състояние включва информация като IP адресите на виртуалните машини, URL адресите и всичко необходимо за реално взаимодействие с получените облачни приложения и инфраструктура.
Например, нашата тестова програма експортира свойството webEndpoint на bucket с име websiteUrl, което представлява пълния URL адрес, по който можем да получим конфигурирания index document. Въпреки че бихме могли да се потопим в файла със състоянието, за да намерим бакет и прочетем това свойство директно, в много случаи нашите стеки експортират полезни свойства като това, които удобно можем да използваме за проверки:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// както преди ...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
url := "http://" + stack.Outputs["websiteUrl"].(string)
resp, err := http.Get(url)
if !assert.NoError(t, err) {
return
}
if !assert.Equal(t, 200, resp.StatusCode) {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if !assert.NoError(t, err) {
return
}
assert.Contains(t, string(body), "Hello, Pulumi!")
},
}) Както и предишните ни проверки в реално време, тази проверка ще се извърши веднага след повдигането на стека, и всичко това в отговор на простото извикване go test. И това е само върхът на айсберга — достъпни са всички тестови възможности на Go, които можете да напишете в кода.
Непрекъсната интеграция на инфраструктурата
Добре е да имате възможност да стартирате тестове на лаптопа, когато се правят много промени в инфраструктурата, за да се проверят преди да бъдат изпратени за ревю на кода. Но ние и много от нашите клиенти тестваме инфраструктурата на различни етапи от жизнения цикъл на разработката:
- Във всеки открит пул реквест за тест преди сливането.
- В отговор на всяко комитване, за да се провери, че сливането е извършено правилно.
- Периодично, например през нощта или еженеделно за допълнително тестване.
- В рамките на тестването на производителността или стрес тестовете, които обикновено се извършват за дълъг период от време и стартират тестове паралелно и/или разгръщат същата програма многократно.
За всяко от тях Pulumi поддържа интеграция с любимата ви система за непрекъсната интеграция. При непрекъсната интеграция това ви дава покритие с тестове за инфраструктурата ви, подобно на софтуера за приложение.
В Pulumi има поддръжка за популярни CI системи. Ето някои от тях:
За повече информация се обърнете към документацията за .
Ефемерни среди
Много мощна възможност, която се открива — е възможността за разгръщане на ефемерни среди единствено за целите на приемачното тестване. Концепцията на Pulumi е проектирана така, че да улесни разгръщането и разрушаването на напълно изолирани и независими среди, всичко с няколко прости команди CLI или с помощта на фреймуърка за интеграционно тестване.
Ако използвате GitHub, Pulumi предлага , което ще ви помогне да свържете приемачното тестване към пул реквестите във вашия CI пайплайн. Просто инсталирайте приложението в GitHub репозитория, а Pulumi в вашия CI и в пул реквестите ще се добавя информация за внедряването на инфраструктурата, актуализациите и резултатите от тестването:

При използване на Pulumi за основните ви приемачни тестове, ще имате нови възможности за автоматизация, които ще подобрят производителността на екипа и ще придадат увереност в качеството на промените.
Резюме
В тази статия видяхме, че при използването на езици за програмиране с общо назначение, много методи за разработка на софтуер стават достъпни, които бяха полезни при разработката на нашите приложения. Те включват модулно тестване, интеграционно тестване и тяхното взаимодействие за провеждане на обширно тестиране по време на изпълнение. Тестовете лесно могат да се стартират при поискване или в вашата CI система.
Pulumi — софтуер с отворен код, безплатен за използване и работещ с вашите любими езици за програмиране и облаци — !
→
Източник: habr.com
