测试postgres db python

时间:2018-02-15 20:39:35

标签: python postgresql python-unittest

我不明白如何测试我的存储库。

我想确定我确实将所有参数的对象保存到数据库中,当我执行我的SQL语句时,我真的收到了我想要的内容。

但是,我不能在"CREATE TABLE test_table单元测试的方法中放置setUp因为它会被多次创建(同一测试用例的测试是并行运行的)。所以,只要我创建同一个类中的2个方法需要在同一个表上工作,它不起作用(表的名称冲突)

同样,我不能放"CREATE TABLE test_table" setUpModule,因为现在表创建了一次,但由于测试是并行运行的,所以没有什么能阻止多次插入同一个对象表,打破了某些领域的单一性约束。

同样,我在每个方法中都不能"CREATE SCHEMA some_random_schema_name",因为我需要为给定的数据库全局“SET search_path TO ...”,因此并行运行的每个方法都会受到影响。

我看到的唯一方法是为每个测试创建"CREATE DATABASE",并使用唯一的名称,并建立与每个数据库的invidual连接。这看起来非常浪费。还有更好的方法吗?

另外,我不能在内存中使用SQLite,因为我需要测试PostgreSQL。

1 个答案:

答案 0 :(得分:5)

最佳解决方案是使用testing.postgresql 模块。这将在用户空间中触发数据库,​​然后在运行结束时再次删除它。您可以将以下内容放在unittest套件中 - 在var maps = [{ template: "pref-color-template", destination: "pref-color" }, { template: "pref-red-template", destination: "pref-red" }, { template: "pref-white-template", destination: "pref-white" }, { template: "pref-country-template", destination: "pref-country" }, { template: "pref-style-template", destination: "pref-style" }]; var compileTemplate = function (template, destination, data) { var templ = Handlebars.compile(document.getElementById(template).innerHTML); var output = templ(data); document.getElementById(destination).innerHTML = output; } for (var i = 0; i < maps.length; i++) { compileTemplate(maps[i].template, maps[i].destination, colorData); } setUpsetUpClass - 取决于您想要的持久性:

setUpModule

如果您希望数据库在测试之间/之后保持不变,您可以使用import testing.postgresql def setUp(self): self.postgresql = testing.postgresql.Postgresql(port=7654) # Get the url to connect to with psycopg2 or equivalent print(self.postgresql.url()) def tearDown(self): self.postgresql.stop() 选项运行它来设置目录 - 这将阻止它在关闭后被删除:

base_dir

在测试之外,它还可以用作上下文管理器,在退出with块时它会自动清理和关闭:

name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)