很快我将发布我的网站项目,在它看到曙光之前,我想准备一些“更新模式”。我将debian与apache、php 5.3和mysql(我认为是最新的)一起使用,它们不是作为一个包安装的,而是单独安装的。
我想出了实施这一过程的简单想法,所以请看一看并指出不足之处:
测试-我发现在某个地方,将站点的测试版本部署到beta.mysite.com子域并从中执行测试是一种常见的做法。测试将使用与实时站点相同的数据库。在一个初始版本之后,每个新的测试候选者都将是一个单独的分支(在部署时合并,仍然对分支一无所知)。
部署-如果测试阶段一切正常,请复制并覆盖页面的旧版本。
我能立即发现的问题:
只要数据库保持不变,测试就可以了。如果改变了怎么办?
我希望更新尽可能透明,没有任何维护模式或任何东西,但我担心复制文件会导致这方面的问题。
还有什么问题吗,或者说有没有更好的方法?
最佳答案
1。测试
通常,您从不在生产环境(尤其是生产数据库)上测试某些东西,原因有三:
性能:测试可能会占用CPU资源,并浪费服务器的其他宝贵资源。因为您不想在测试期间降低生产环境的性能,所以不应该使用生产环境来实现这一点。
数据保护:您不想在测试期间更改生产数据库中的数据。这意味着,不仅你的测试可能有一个有限的范围(即,你可能会三思而后行,在测试某个可能会破坏与你的实际用户相关的所有数据的bug之前,让该bug稍后被黑客利用),而且你可能会意外地通过运行一个未经测试的代码来更改数据你的生产数据库。
安全性:如果您处于公司的环境中,并且有一个团队,那么您可能会将与测试相关的工作分配给一个专用的测试人员。出于安全原因,让测试人员访问生产环境不是一个好主意。
1.1试验环境
测试环境必须尽可能类似于生产环境。例如,如果使用.NET Framework 3.5测试为Windows XP提供的应用程序,则不应在使用.NET Framework 4的Windows 7下测试该应用程序,因为在测试过程中,一切都会正常工作,并且一旦客户开始使用该应用程序,就会失败。
示例:有一次,我开发了一个使用ntfs备用数据流的应用程序。无论是在开发过程中还是在测试过程中,一切都非常顺利,没有人想到2009年,fat32还活着。当然,一旦投入生产,一位客户将应用程序安装在一个fat32格式的闪存驱动器上,它就崩溃了。
请注意,这并不意味着您应该在开发期间使用相同的环境。
对于数据库,情况就不同了。数据库引擎和版本必须相同,架构必须相同(相同的表、相同的约束等),但数据在大多数情况下应该不同,测试数据库中填充的是一些随机数据,与生产中的数据无关。
1.2数据库:测试瓶颈
例如,如果一个网站最近发布,你没有大量的数据。如果数据库包含已注册用户的列表,则开始时只有几个用户。另一方面,您可能不仅需要测试应用程序是否工作正常,还需要测试性能是否正确以及瓶颈是什么。在这种情况下,您需要使用大量数据对其进行测试:这样,您可以在生产环境中拥有几千个用户,在测试环境中随机生成数十亿个用户帐户。
1.3数据库:测试输出的正确性
当您希望测试数据与生产数据不同时,另一种情况是避免HTML注入并验证输出是否正确。如果你有一个电子商务网站,你有一个sql表Products,每个产品都有一个标题,这个标题将显示在网站上。在测试环境中,您应该具有以下名称的产品:
1. A very long name of a product goes here. Oh, this name is really huge!
2. javascript:alert('<a>&\é<%щ你好')
3.
4. '; delete * from Users
关于php - 测试,部署和更新PHP网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029309/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel