Golang数据库测试库 - Oracle兼容方案

Golang数据库测试库 - Oracle兼容方案 我正在寻找一个支持Oracle数据库的、用于数据库测试(设置/拆卸测试数据)的Go语言库。我找到了 GitHub - go-testfixtures/testfixtures: Ruby on Rails like test fixtures for Go. Write tests against a real database,但它不支持Oracle。

有什么建议吗?

此致 Thomas

1 回复

更多关于Golang数据库测试库 - Oracle兼容方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于Oracle数据库的测试数据管理,可以考虑以下两种方案:

方案一:使用testfixtures配合Oracle驱动

虽然testfixtures官方不支持Oracle,但可以通过自定义驱动的方式实现:

package main

import (
    "database/sql"
    "fmt"
    "log"
    
    _ "github.com/sijms/go-ora/v2"
    "github.com/go-testfixtures/testfixtures/v3"
)

type OracleLoader struct{}

func (o OracleLoader) LoadFixtures(db *sql.DB, directory string) error {
    // 实现Oracle特定的SQL加载逻辑
    // 处理Oracle的SQL语法差异
    return nil
}

func main() {
    db, err := sql.Open("oracle", "oracle://user:pass@localhost:1521/service")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 自定义Oracle适配器
    fixtures, err := testfixtures.New(
        testfixtures.Database(db),
        testfixtures.Dialect("oracle"),
        testfixtures.Directory("testdata/fixtures"),
    )
    if err != nil {
        log.Fatal(err)
    }

    // 加载测试数据
    if err := fixtures.Load(); err != nil {
        log.Fatal(err)
    }
}

方案二:使用go-txdb创建测试隔离环境

package main

import (
    "database/sql"
    "fmt"
    "testing"
    
    _ "github.com/DATA-DOG/go-txdb"
    _ "github.com/sijms/go-ora/v2"
)

func init() {
    // 注册Oracle的txdb驱动
    sql.Register("txdb", 
        &txdb.Driver{
            DriverName: "oracle",
            DSN:        "oracle://user:pass@localhost:1521/service",
        })
}

func TestWithOracle(t *testing.T) {
    db, err := sql.Open("txdb", "identifier")
    if err != nil {
        t.Fatal(err)
    }
    defer db.Close()

    // 每个测试都有独立的事务
    _, err = db.Exec("INSERT INTO users (id, name) VALUES (1, 'test')")
    if err != nil {
        t.Fatal(err)
    }

    // 测试结束后自动回滚
}

方案三:直接使用Oracle SQL脚本

package main

import (
    "database/sql"
    "io/ioutil"
    "strings"
    
    _ "github.com/sijms/go-ora/v2"
)

func loadOracleFixtures(db *sql.DB, filepath string) error {
    content, err := ioutil.ReadFile(filepath)
    if err != nil {
        return err
    }

    // 按分号分割SQL语句(考虑Oracle的PL/SQL块)
    statements := splitOracleStatements(string(content))
    
    for _, stmt := range statements {
        if strings.TrimSpace(stmt) == "" {
            continue
        }
        _, err := db.Exec(stmt)
        if err != nil {
            return fmt.Errorf("failed to execute: %s, error: %v", stmt, err)
        }
    }
    return nil
}

func splitOracleStatements(sql string) []string {
    // 实现Oracle SQL语句分割逻辑
    // 需要处理PL/SQL块、斜杠分隔符等
    return []string{sql}
}

方案四:使用golang-migrate管理测试数据

package main

import (
    "github.com/golang-migrate/migrate/v4"
    "github.com/golang-migrate/migrate/v4/database/oracle"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)

func setupTestDatabase() error {
    db, err := sql.Open("oracle", "oracle://user:pass@localhost:1521/service")
    if err != nil {
        return err
    }
    
    driver, err := oracle.WithInstance(db, &oracle.Config{})
    if err != nil {
        return err
    }
    
    m, err := migrate.NewWithDatabaseInstance(
        "file://testdata/migrations",
        "oracle", 
        driver,
    )
    if err != nil {
        return err
    }
    
    // 运行迁移(包含测试数据)
    err = m.Up()
    if err != nil && err != migrate.ErrNoChange {
        return err
    }
    
    return nil
}

这些方案中,go-txdb提供了最好的测试隔离性,每个测试都在独立事务中运行,测试后自动回滚。如果需要更复杂的测试数据管理,可以基于testfixtures的接口实现Oracle适配器。

回到顶部