背景资料:
所以Jan Hudec在上一个问题中给了我一些建议。他告诉我这是一个很好的做法:
这意味着每个开发人员的计算机都需要拥有自己的LAMP堆栈(或者至少安装了Apache,PHP,MySQL和Python)。
代码主要是JavaScript和PHP文件,因此克隆它并不是什么大问题。但是,我们如何在本地管理数据库?
在这种情况下,我们只有两个表,在本地重新创建整个数据库很简单(至少对于测试而言)。但是在未来当数据库变得太大时,我们应该只是远程登录服务器上的MySQL数据库,还是应该只有一个“样本”数据用于开发和测试目的?
答案 0 :(得分:4)
您所做的是从“每个人在一个环境中共同工作”转变为“每个人都有自己的发展环境”。主要的好处是每个人都不会踩到对方的脚。
其他好处包括异构开发环境,即如果每个人都在同一台机器上开发,那么软件将依赖于那个设置,因为开发人员很懒惰。如果每个人都在不同的环境中开发,即使只是略有不同版本的相同内容,他们也会被迫编写更强大的代码来处理它。
正如您所注意到的,主要缺点是设置环境更加困难。特别是,确保数据库正常工作。
首先,每个开发人员都应该拥有自己的数据库。这并不意味着他们都必须拥有自己的数据库服务器(虽然它有利于异构目的)但是他们应该拥有自己控制的数据库实例。
其次,您应该拥有架构,而不仅仅是数据库中的任何内容。它应该在版本控制的文件中。
第三,建立一个新的数据库应该是自动的。这使开发人员可以毫无困难地设置一个干净的数据库。
第四,您需要将有趣的测试数据导入该数据库。事情变得有趣......
你有几条路可以做到这一点。
首先是转储包含实际数据的现有数据库,当然要进行清理。这很容易,并且提供了真实的数据,但它非常脆弱。开发人员将不得不寻找有趣的数据来进行测试。这些数据可能会在下一次转储中发生变化,从而打破了他或者根本就不存在。
其次是写“测试装置”。基本上每个测试都使用所需的测试数据填充数据库。这样做的好处是允许开发人员准确获取他们想要的数据,并准确了解数据库所处的状态。缺点是它可能非常耗时,而且数据通常太干净了。数据不会包含可能导致实际错误的所有实际数据。
第三是根本不访问数据库,而是“模拟”所有数据库调用。您通常会查询通常查询数据库的所有方法,而不是返回测试数据。这就像编写测试夹具一样,并且具有大多数相同的缺点和好处,但它的FAR更具侵入性。除非你的系统是专门设计的,否则很难做到。它也从未真正测试数据库调用是否有效。
最后,您可以构建一组库,为您生成半随机数据。我在电子游戏之后称之为“模拟人生技术”,在那里你制造假家庭,折磨他们然后扔掉它们。例如,假设您有User对象需要名称,年龄,Payment对象和Session对象。要测试用户,您可能希望用户具有不同的姓名,年龄,支付能力和登录状态。控制生成名称,年龄,付款和会话的测试数据所需的所有内容。所以你编写了一个生成名称的函数和一个生成年龄的函数。这些可以像从列表中随机选取一样简单。然后你写一个让你成为Payment对象,一个是Session对象。默认情况下,除非另行指定,否则所有属性都是随机的,但有效。例如......
# Generate a random login session, but guarantee that it's logged in.
session = Session.sim( logged_in = true )
然后你可以用它来组建一个有趣的用户。
# A user who is logged in but has an invalid Visa card
# Their name and age will be random but valid
user = User.sim(
session = Session.sim( logged_in = true ),
payment = Payment.sim( invalid = true, type = "Visa" ),
);
这具有测试装置的所有优点,但由于某些数据是不可预测的,因此它具有实际数据的一些优点。将“有趣”数据添加到默认的sim和rand函数中会产生广泛的影响。例如,向random_name
添加Unicode名称可能会发现各种有趣的错误!不幸的是,建立起来既昂贵又耗时。
你有它。不幸的是,数据库问题没有简单的答案,但我恳请你不要简单地复制生产数据库,因为从长远来看这是一个失败的主张。您可能会对所有选择进行混合:复制,固定,模拟,半随机数据。
答案 1 :(得分:1)
一些选项,按复杂程度增加:
(可选)在主数据库上设置只读用户,并配置应用程序以允许您切换到与主数据库的只读连接,以防您无法等待主数据库的下一个副本数据
答案 2 :(得分:0)
最好尽快(半)自动构建系统,将存储库存储的源数据转换为实时系统(减少手工操作 - 减少更改以产生非代码错误)和(也许)某种类型的Continuos集成(经常测试,快速发现bug)。对于构建系统(DB-part),您只需将初始数据(表结构,数据转储)准备为(版本化的)文本,这些文本是