现在的功能测试还是失败的,继续修改代码,让其通过。因为HTML现在保存在模板中,可以尽情修改,无需编写额外的单元测试。我们需要一个<h1>元素

修改:lists/templates/home.html

<html>
<head>
<title>To-Do lists</title>
</head>>
<body>
<h1>Your To-Do list</h1>
</body>>
</html>

功能测试(前提需要先运行服务器 # python manage.py runserver)

报错:element: [id="id_new_item]

继续修改

<html>
<head>
<title>To-Do lists</title>
<input id="id_new_item" />
</head>>
<body>
<h1>Your To-Do list</h1>
</body>>
</html>

And now?

AssertionError: '' != 'Enter a to-do item'

加上占位文字

        <input id="id_new_item" placeholder="Enter a to-do item"/>

运行得到下面错误

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="id_list_table"]

因此要在页面中加入表格,目前表格是空的

        <input id="id_new_item" placeholder="Enter a to-do item"/>
<table id="id_list_table"></table>
</body>

现在的功能测试如何:

    any(row.text == '1: Buy peacock feathers' for row in rows)  #
AssertionError: False is not true

原来是assertTrue,因为没有给他提出明确的失败消息,可以把自定义的错误消息传给unittest中的大多数assertx方法

        self.assertTrue(
any(row.text == '1: Buy peacock feathers' for row in rows), #
"New to-do item did not appear in table"
)

再次运行功能测试,应该会看到我们编写的消息:

AssertionError: False is not true : New to-do item did not appear in table

现在想让测试通过,就要真正处理用户提交的表单,后续在讨论

这里提交一下

git diff
git commit -am "Front page HTML now generated from a template--现在从模板生成的首页html"

小结:TDD流程

前面我们见识了测试驱动开发流程中涉及的所有主要概念

  1. 功能测试
  2. 单元测试
  3. “单元测试/编写代码”循环
  4. 重构

流程图,能清楚地表明流程中的循环

如果既有单元测试又有功能测试,TDD流程如下

功能测试是应用是否正常运行的最终评判,单元测试只是整个开发过程中的一个辅助工具。

Django学习系列9:接着修改首页的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  3. [python][django学习篇][10]再次修改博客首页模板

    目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据.下面来稍微改造一下模板: 删除所有article标签,然后添加以下内容,将从数据库读取到的内容填充到模板变量{{ p ...

  4. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...

  5. Django学习系列之Python+Xadmin

    项目树 引入xadmin pycharm在项目中创建存放xadmin的目录 右键项目名称-->pythonpackage-->输入名称:extra_app 拷贝xadmin代码到extra ...

  6. Django学习系列17:在模板中渲染待办事项

    前面提到的问题中在表格中显示多个待办事项 是最后一个容易解决的问题.要编写一个新单元测试,检查模板是否也能显示多个待办事项: lists/tests.py def test_displays_all_ ...

  7. Django学习系列16:处理完POST请求后重定向

    处理完POST请求后重定向 代码中new_item_text = ''的写法不怎么样.解决第二个问题时候,顺带把这个问题也解决了. 人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧.修 ...

  8. Django学习系列15:把POST请求中的数据存入数据库

    要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...

  9. Django学习系列11:在服务器中处理POST请求

    之前的代码还没有为表单指定action=属性,因此提交表单默认返回之前渲染的页面,即“/”,这个由视图函数home_page处理.下面修改这个视图函数,让它能处理POST请求. 这意味着要为视图函数h ...

随机推荐

  1. laravel多主多从配置示例

    'mysql' => [ 'write' => [ [ 'host' => '192.168.1.180', 'username' => '', 'password' => ...

  2. 059. Spiral Matrix II

    题目链接:https://leetcode.com/problems/spiral-matrix-ii/description/ Given a positive integer n, generat ...

  3. hibernate之inverse=true相关配置讲解

      首先inverse=”true”是在双向关联里面使用单向关联没有这个配置 inverse – 标记由哪一方来维护关联关系(双向关联中会用到) inverse默认值为false 如果inverse设 ...

  4. Android开发 互相调用模式之提供扩展类

    此种方法适用于:比如你要让Android做一些事情,这些事用不到任何资源,在Android下用纯代码就能实现它,这样就可以在Android下写好,将它封装成一个方法,打成包按照下面的方式丢给Unity ...

  5. so的封装和使用

    背景 在linux平台下,要实现函数的封装,一般采用的是so动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成so动态库 编写相应的c文件代码,实现函数 ...

  6. MFC之MessageBox、AfxMessageBox用法

    在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框. 在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: 1.调用API中的MessageBox ...

  7. delete an extra edge from BST

    Given a BST, remove an extra edge to make it BST. 7 / \ 5   9 /  \ / 3    8 public void deleteEdge(T ...

  8. [转帖](整理)GNU Hurd项目详解

    (整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...

  9. 使用Redis實現秒殺功能

    <?php $id = 1; $pdo=new PDO("mysql:host=127.0.0.1;dbname=test","root","r ...

  10. MySQL中出现的小问题

    ./scripts/mysql_install_db: line 249: /app/mysql/bin/my_print_defaults: cannot execute binary fileNe ...