рдЬрд╛рдУ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ Postgresql рд╕рдорд╛рдирд╛рдВрддрд░ рдПрдХреАрдХрд░рдг рдЯреЗрд╕реНрдЯ


рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ред рдЖрдорддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Postgresql рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреЗрдд рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛, рдЬреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рд░реНрдХрд┐рдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдмрдирд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдореЗрдВ рдПрдХ рд╣реИрд╢ рд╣реЛрддрд╛ рд╣реИред


рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди


рдЪрд▓реЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдмреЗрди рдЬреЙрдирд╕рди рдХреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп (рдмреЗрди рдЬреЙрдирд╕рди) рдХреЛ рд▓рд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдХреЛрдб рдХреА рдХреБрдЫ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдореЗрд░реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реАред

рдбреЗрдЯрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ


рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреЛ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рдЯреЗрд╕реНрдЯрдбреЗрдЯрд╛" рдирд╛рдордХ рд╕реНрдХрд╛рдЗрдк рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред рджреВрд╕рд░реЗ, рдЬрдм рдЖрдк "рдЧреЛ рдЯреЗрд╕реНрдЯ" рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореМрдЬреВрджрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдкреИрдХреЗрдЬ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯрдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛


package database import ( "math/rand" "strconv" "testing" "time" _ "github.com/lib/pq" "database/sql" ) const ( dbPort = 5439 dbUser = "postgres" dbPassword = "postgres" dbName = "test" ) func CreateTestDatabase(t *testing.T) (*sql.DB, string, func()) { connectionString := fmt.Sprintf("port=%d user=%s password=%s dbname=%s sslmode=disable", dbPort, dbUser, dbPassword, dbName) db, dbErr := sql.Open("postgres", connectionString) if dbErr != nil { t.Fatalf("Fail to create database. %s", dbErr.Error()) } rand.Seed(time.Now().UnixNano()) schemaName := "test" + strconv.FormatInt(rand.Int63(), 10) _, err := db.Exec("CREATE SCHEMA " + schemaName) if err != nil { t.Fatalf("Fail to create schema. %s", err.Error()) } return db, schemaName, func() { _, err := db.Exec("DROP SCHEMA " + schemaName + " CASCADE") if err != nil { t.Fatalf("Fail to drop database. %s", err.Error()) } } } 


рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "CreateTestDatabase" рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди, рдмрдирд╛рдП рдЧрдП рд╕реНрдХреАрдорд╛ рдХрд╛ рдирд╛рдо рдФрд░ рдЗрд╕ рд╕реНрдХреАрдорд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдЬ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡рд┐рдлрд▓ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред (рдиреЛрдЯ: рдХреНрд▓реАрдирдЕрдк рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдорд┐рд╢реЗрд▓ рд╣рд╛рд╢рд┐рдореЛрдЯреЛ рдХреА рдПрдбрд╡рд╛рдВрд╕реНрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдСрди рдЧреЛ рдЯреЙрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред

Download рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛рд╕реИрдЯ


рдореИрдВрдиреЗ ".sql" рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдПрдХ (1) sql рдореЗрдВ рдПрдХ (1) рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрдмрд╛рдж рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рднреА sql рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ "testdata" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг sql рдлрд╝рд╛рдЗрд▓ рд╣реИред

 CREATE TABLE book ( title character varying(50), author character varying(50) ); INSERT INTO book VALUES ('First Book','First Author'), ('Second Book','Second Author') ; 

рдФрд░ рдпрд╣рд╛рдБ рдЬрдЯрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреВрдареЗ рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рд╣рдо рдЗрди sql рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдХреЛ рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд (рд▓рд┐рдЦ) рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдпрд╛ рд╡рд╛рдВрдЫрд┐рдд рдЕрд╕реНрдерд╛рдпреА рд╕реНрдХреАрдорд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдореЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдХреАрдорд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рд┐рдПрдЯ рдЯреЗрдмрд▓ рдмреБрдХ ... рдХреНрд░рд┐рдПрдЯ рдЯреЗрдмрд▓ uniqueschema.book ... рдФрд░ INSERT INTO рдмреБрдХ ... INSERT INTO uniqueschema.book рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ ... рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛрдб рд╣реИ:

 package datalayer import ( "bufio" "fmt" "io" "os" "regexp" "testing" "database/sql" "github.com/Hendra-Huang/databaseintegrationtest/testingutil" //     (   ,  79) ) //        var schemaPrefixRegexps = [...]*regexp.Regexp{ regexp.MustCompile(`(?i)(^CREATE SEQUENCE\s)(["\w]+)(.*)`), regexp.MustCompile(`(?i)(^CREATE TABLE\s)(["\w]+)(\s.+)`), regexp.MustCompile(`(?i)(^ALTER TABLE\s)(["\w]+)(\s.+)`), regexp.MustCompile(`(?i)(^UPDATE\s)(["\w]+)(\s.+)`), regexp.MustCompile(`(?i)(^INSERT INTO\s)(["\w]+)(\s.+)`), regexp.MustCompile(`(?i)(^DELETE FROM\s)(["\w]+)(.*)`), regexp.MustCompile(`(?i)(.+\sFROM\s)(["\w]+)(.*)`), regexp.MustCompile(`(?i)(\sJOIN\s)(["\w]+)(.*)`), } //      func addSchemaPrefix(schemaName, query string) string { prefixedQuery := query for _, re := range schemaPrefixRegexps { prefixedQuery = re.ReplaceAllString(prefixedQuery, fmt.Sprintf("${1}%s.${2}${3}", schemaName)) } return prefixedQuery } func loadTestData(t *testing.T, db *sql.DB, schemaName string, testDataNames ...string) { for _, testDataName := range testDataNames { file, err := os.Open(fmt.Sprintf("./testdata/%s.sql", testDataName)) testingutil.Ok(t, err) reader := bufio.NewReader(file) var query string for { line, err := reader.ReadString('\n') if err == io.EOF { break } testingutil.Ok(t, err) line = line[:len(line)-1] if line == "" { query = addSchemaPrefix(schemaName, query) _, err := db.Exec(query) testingutil.Ok(t, err) query = "" } query += line } file.Close() } } 


рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрдорд╛рдг


рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реАрдирдЕрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рд╣реЛрдЧреАред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕реНрдХреАрдорд╛ рдирд╛рдо рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рд╡реЗрд╢ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "t.Parallel ()" рдЬреЛрдбрд╝реЗрдВред
рдиреАрдЪреЗ рдкреВрд░реНрдг рдХреЛрдб рд╣реИ:

 //            "integration" (. build flags) // +build integration package datalayer import ( "context" "testing" "github.com/Hendra-Huang/databaseintegrationtest/database" "github.com/Hendra-Huang/databaseintegrationtest/testingutil" ) func TestInsertBook(t *testing.T) { t.Parallel() db, schemaName, cleanup := database.CreateTestDatabase(t) defer cleanup() loadTestData(t, db, schemaName, "book") // will load data which the filename is book title := "New title" author := "New author" // those 2 lines code below are not a good practice // but it is intentional to keep the focus only on integration test part // the important part is database connection has to be configurable insertBookQuery = addSchemaPrefix(schemaName, insertBookQuery) // override the query and add schema to the query err := InsertBook(context.Background(), db, title, author) // will execute insertBookQuery with the provided connection testingutil.Ok(t, err) } func TestGetBooks(t *testing.T) { t.Parallel() db, schemaName, cleanup := database.CreateTestDatabase(t) defer cleanup() loadTestData(t, db, schemaName, "book") getBooksQuery = addSchemaPrefix(schemaName, getBooksQuery) books, err := GetBooks(context.Background(), db) testingutil.Ok(t, err) testingutil.Equals(t, 2, len(books)) } 


рдиреЛрдЯ: "TestGetBooks," рдХреЗ рддрд╣рдд, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реА 2 рдкреБрд╕реНрддрдХреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреА рдореИрдВрдиреЗ "testdata / book.sql" рдореЗрдВ рдЗрддрдирд╛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рджрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдКрдкрд░ рдПрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╣реИред рдпрджрд┐ рд╣рдо рджреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд░реНрдХрд┐рдЯ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рдЯреЗрд╕реНрдЯрдЧреЗрдЯрдмреБрдХ" рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ, 2 рдкрд░реАрдХреНрд╖рдг рд╕реЗ, 1 рдКрдкрд░ рдкрд░реАрдХреНрд╖рдг рд╕рдореНрдорд┐рд▓рд┐рдд рд╕реЗред рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рд▓рд╛рдн рд╣реИ - рдЙрдирдХрд╛ рдбреЗрдЯрд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдпрд╣рд╛рдБ github рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдХреЛ 40-50% рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрдм рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдЪреНрдЫреА рдкрд░реАрдХреНрд╖рд╛ рджреЗрдиреА рд╣реИред

- medium.com/kongkow-it-medan/parallel-database-integration-test-on-go-application-8706b150ee2e рд╕реЗ рдЪрд┐рддреНрд░

Source: https://habr.com/ru/post/hi466459/


All Articles