我正在 Google 应用程序引擎上创建一个应用程序,想知道是否有办法使用 python 进行自动化测试。

谢谢!

最佳答案

我们一般不会测试太多。我们曾经有一个“80% 测试覆盖率”规则,但发现这并没有让我们变得更好或更快。我们使用的大多数代码和数据结构的设计都非常具有防御性,因此很少有无法撤消的伤害。我们的用户更喜欢快速的周转时间,而不是 100% 的正常运行时间。

我们有两个应用程序设置:我的 app.appspot.com 和我的 app-test.appspot.com 。整个代码库经过设计,以确保 app-test.appspot.com 永远不会更改外部系统中的状态。

有时我们会将数据从 app.appspot.com 复制到 app-test.appspot.com 。它可能会变得困惑,因为数据存储的 id 生成计数器不会更新,但它工作得很好。

我们在这两个系统上进行开发。前端开发主要在 app.appspot.com 上完成,后端实验在 app-test.appspot.com 上完成。

我们有三个分支:master、rc 和 production.rc 从 master 更新,生产从 rc 更新。 rc 每天部署到 rc.app.appspot.com 或由他们操作。生产每周部署到 production.app.appspot.com(也可以通过其他应用程序名称访问。

开发人员通常会访问 dev-whoami .app.appspot.com 进行试验。我们很少使用开发服务器,因为我们需要来自数据存储的大量数据。

现在进行测试:我们主要使用验收测试。我们有一个名为 resttest_dsl 的小框架,我们用它来描述这样的测试:

client.GET('/').responds_access_denied()
client.GET('/', auth='user').responds_html()
client.GET('/admin').responds_access_denied()
client.GET('/admin', auth='user').responds_access_denied()
client.GET('/admin', auth='admin').responds_html()
client.GET('/artikel/').responds_with_html_to_valid_auth()
client.GET('/artikel/?q=Ratzfratz', auth='user').responds_html()
client.GET('/api/ic/v3/a/14600/03/zukunft.json').responds_with_json_to_valid_auth()
client.GET('/kunden/SC50313/o/SO1194829/', auth='user').responds_html()
client.GET('/api/masterdata/artikel/v2/artnr/14600/bild=s210').redirects_to('...')

主机名和凭据具有默认值,但可以被环境变量覆盖。我们修复过的大多数错误都在那里进行了回归测试。我们使用 Makefile 来驱动整个东西。蛋:
deploy:
appcfg.py update -V dev-`whoami` -A app .
TESTHOST=dev-`whoami`.app.appspot.com make resttest
open http://dev-`whoami`.app.appspot.com/

部署总是从中央 git 存储库发生,如下所示:
deploy_production:
rm -Rf tmp
mkdir tmp
(cd tmp ; git clone [email protected]:user/app.git)
(cd tmp/app ; git checkout production ; make dependencies)
(cd tmp/app ; git show-ref --hash=7 refs/remotes/origin/production > version.txt)
appcfg.py update -V "v`cat tmp/app/version.txt`" -A app tmp/app
(cd tmp/huWaWi ; TESTHOST="v`cat version.txt`".app.appspot.com make resttest)
appcfg.py update -V production -A app tmp/app
appcfg.py backends -V production -A app tmp/huWaWi app

我们首先部署到一个在 AppEngine 上标记为当前修订的版本。然后我们针对这个新部署的版本运行 resttest.py。失败时 m make 停止执行。如果没有发生故障,则部署“生产版本”。

我们还对源代码 checkin 运行强制 pep8pyflakespylint 检查。

总而言之,我们有非常简单的测试,但是针对生产代码和数据运行了很多测试。对我们来说,这捕获了我们所做的大部分错误,而这相对较少。

10-07 23:37