当前位置: 首页 > 面试题库 >

测试驱动的开发,以检查涉及数据库查询的方法

丁淇
2023-03-14
问题内容

我想使用Golang创建数据库驱动的应用程序。我正在尝试以TDD方式进行。当我尝试测试进行Sql查询的方法时,有哪些可用的软件包?

  • 我不想连接到用于开发的默认数据库。在运行测试时,我可以编写代码来占用另一个测试数据库,但是是否有已经执行该操作的go库。

  • 是否有任何可在不连接数据库的情况下进行db测试的库?

用golang进行数据库测试的标准方法是什么?


问题答案:

不久前,在重构自己的一些测试时,我也遇到了类似的问题,有两种方法可以做到:

a)提供一个导出的类型和一个返回它的OpenConnect函数-例如

type DB struct {
    db *sql.DB
}

// Using http://jmoiron.github.io/sqlx/ for this example, but
// it has the same interface as database/sql
func Open(opts *Options) (*DB, error) {
    db, err := sqlx.Connect(opts.Driver, fmt.Sprintf("host=%s user=%s dbname=%s sslmode=%s", opts.Host, opts.User, opts.Name, opts.SSL))
    if err != nil {
        return nil, err
    }

    return &DB{db}, nil
}

…然后进行 每个 测试,编写设置和拆卸函数,这些函数返回*DB您定义数据库功能的实例(作为方法-即func (db *DB) GetUser(user *User) (bool, error)):

// Setup the test environment.
func setup() (*DB, error) {
    err := withTestDB()
    if err != nil {
        return nil, err
    }

    // testOptions is a global in this case, but you could easily
    // create one per-test
    db, err := Open(testOptions)
    if err != nil {
        return nil, err
    }

    // Loads our test schema
    db.MustLoad()
    return db, nil
}

// Create our test database.
func withTestDB() error {
    db, err := open()
    if err != nil {
        return err
    }
    defer db.Close()

    _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", testOptions.Name))
    if err != nil {
        return err
    }

    return nil
}

请注意,这有点“集成”测试,但是我强烈希望针对“真实”数据库进行测试,因为模拟接口不会帮助您捕获查询/查询语法的问题。

b)尽管在应用程序方面扩展性较差,但替代方法是在测试中db *sql.DB初始化一个全局变量,init()因为测试没有确定的顺序init(),因此您可以在其中运行该测试。即

var db *sql.DB

func init() {
    var err error
    // Note the = and *not* the assignment - we don't want to shadow our global
    db, err = sqlx.Connect(...)
    if err != nil {
        ...
    }

    err := db.loadTestSchema
    // etc.
}

func TestGetUser(t *testing.T) {
   user := User{}
   exists, err := db.GetUser(user)
   ...
}

您可以在drone.io的GitHub
repo中
找到一些实际示例,并且我还建议您阅读有关构建Go应用程序(尤其是DB东西)的文章。



 类似资料:
  • 本文向大家介绍php连接oracle数据库及查询数据的方法,包括了php连接oracle数据库及查询数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php连接oracle数据库及查询数据的方法。分享给大家供大家参考。具体分析如下: php有强大的功能不但可以支持mysql,mssql,mysqli之个我们还可以与oracle数据连接,要让php支持oracle非常的简单我们只要把

  • 大家好,请看我的问题: 现有微服务A、微服务B,两个服务链接的是不同的数据库而且不在同一个机器上。 微服务A中的数据库人员表(base_user)存放了一万条人员信息,微服务B中需要调用A的接口,将没有调入过的人员列表查询出来(然后在前端勾选后调入到B的sys_user表中)。 我的实现方式是: 首先从B的sys_user中查询出所有的人员id列表,然后通过该id列表调用A的接口,A的接口执行my

  • Wikipedia 上的定义: 测试驱动开发 (TDD) 是一种以非常短的开发周期不断迭代的软件开发过程:首先开发者对将要实现的功能或者新的方法写一个失败的自动化测试用例,然后就去写代码来通过这个测试用例,最终通过重构代码让一其达到可接受的水准。Kent Beck, 这个技术创造者或者说重新发现者,在2003年声明TDD 鼓励简单的设计和激励信心。 目前你可以应用的几种不同类型的测试: 单元测试

  • 我有三个表,product、category和product_to_category。Product具有主键product_id、category_id和PRODUCT_TO_CategoryP2C_ID。product_to_category使用产品各自的ID以多对多的关系将产品链接到类别。 基本上,我想写一个查询,从类别表中不存在的类别中选择所有产品。这是由于产品正在从另一个数据库迁移。 我有

  • 1 What 什么是TDD TDD,全称Test Driven Development。测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。 测试驱动开发主要指 单元测试 2 Why 为什么要采用TDD 自动测试代码是一张安全网:让我们写的代码沙子不会散掉,对自己的代码更自信; 自动测试代码引

  • 我一直在玩R中的数据库查询,这些查询是在带有PostGIS扩展的Postgres数据库上执行的。这意味着我使用了一些没有R等价物的PostGIS函数。如果不是因为这个,我可能只是在本地测试数据帧上执行相同的函数,而不是在数据库连接上执行相同的函数,但是由于PostGIS函数,这是不可能的。 是否有一种简单的方法可以在测试数据库中创建测试数据并对其运行查询并评估结果?我有一个R不直接支持的WKB列,