- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近,我在用 Python 开发 GUI 应用程序时一直在试验 TDD。我发现通过测试来验证我的代码的功能是非常令人放心的,但是要遵循 TDD 的一些推荐实践是很棘手的。也就是说,首先编写测试一直很困难。而且我发现很难使我的测试可读(由于大量使用模拟库)。
我选择了一个名为 mocker 的模拟库.我经常使用它,因为我正在测试的大部分代码都会调用 (a) 我的应用程序中依赖于系统状态的其他方法或 (b) 没有事件循环就无法存在的 ObjC/Cocoa 对象,等等。
无论如何,我有很多这样的测试:
def test_current_window_controller():
def test(config):
ac = AppController()
m = Mocker()
ac.iter_window_controllers = iwc = m.replace(ac.iter_window_controllers)
expect(iwc()).result(iter(config))
with m:
result = ac.current_window_controller()
assert result == (config[0] if config else None)
yield test, []
yield test, [0]
yield test, [1, 0]
请注意,这实际上是三个测试;都使用相同的参数化测试函数。这是正在测试的代码:
def current_window_controller(self):
try:
# iter_window_controllers() iterates in z-order starting
# with the controller of the top-most window
# assumption: the top-most window is the "current" one
wc = self.iter_window_controllers().next()
except StopIteration:
return None
return wc
我在使用 mocker 时注意到的一件事是,首先编写应用程序代码然后再返回并编写测试会更容易,因为大多数时候我都在模拟许多方法调用和语法编写模拟调用比应用程序代码更冗长(因此更难编写)。编写应用程序代码然后从中建模测试代码会更容易。
我发现使用这种测试方法(以及一些纪律)我可以轻松编写具有 100% 测试覆盖率的代码。
我想知道这些测试是否是好的测试?当我最终发现编写好的测试的秘诀时,我会后悔这样做吗?
我是否违反了 TDD 的核心原则以至于我的测试是徒劳的?
最佳答案
如果您在编写代码并使它们通过后才编写测试,那么您就不是在进行 TDD(您也不会从测试优先或测试驱动开发中获得任何好处。 . 查看有关 TDD 权威书籍的 SO 问题)
One of the things I've noticed with using mocker is that it's easier to write the application code first and then go back and write the tests second, since most of the time I'm mocking many method calls and the syntax to write the mocked calls is much more verbose (thus harder to write) than the application code. It's easier to write the app code and then model the test code off of that.
当然,这更容易,因为您只是在通过使用特定类型的画笔将其绘制为橙色后测试天空是否为橙色。这是 retrofit 测试(为了 self 保证)。模拟很好,但你应该知道如何以及何时使用它们——就像俗话说的那样“当你有一把锤子时,一切看起来都像钉子”也很容易写出一大堆难以阅读且没有帮助的东西- 是测试。花在理解测试内容上的时间是浪费的时间,可以用来修复损坏的时间。
重点是:
关于python - 测试 GUI 代码 : should I use a mocking library?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/79454/
我在优化 JOIN 以使用复合索引时遇到问题。我的查询是: SELECT p1.id, p1.category_id, p1.tag_id, i.rating FROM products p1
我有一个简单的 SQL 查询,我正在尝试对其进行优化以删除“使用位置;使用临时;使用文件排序”。 这是表格: CREATE TABLE `special_offers` ( `so_id` int
我有一个具有以下结构的应用程序表 app_id VARCHAR(32) NOT NULL, dormant VARCHAR(6) NOT NULL, user_id INT(10) NOT NULL
此查询的正确索引是什么。 我尝试为此查询提供不同的索引组合,但它仍在使用临时文件、文件排序等。 总表数据 - 7,60,346 产品= '连衣裙' - 总行数 = 122 554 CREATE TAB
为什么额外的是“使用where;使用索引”而不是“使用索引”。 CREATE TABLE `pre_count` ( `count_id`
我有一个包含大量记录的数据库,当我使用以下 SQL 加载页面时,速度非常慢。 SELECT goal.title, max(updates.date_updated) as update_sort F
我想知道 Using index condition 和 Using where 之间的区别;使用索引。我认为这两种方法都使用索引来获取第一个结果记录集,并使用 WHERE 条件进行过滤。 Q1。有什
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
mysql Ver 14.14 Distrib 5.1.58,用于使用 readline 5.1 的 redhat-linux-gnu (x86_64) 我正在接手一个旧项目。我被要求加快速度。我通过
在过去 10 多年左右的时间里,我一直打开数据库 (mysql) 的连接并保持打开状态,直到应用程序关闭。所有查询都在连接上执行。 现在,当我在 Servicestack 网页上看到示例时,我总是看到
我使用 MySQL 为我的站点构建了一个自定义论坛。列表页面本质上是一个包含以下列的表格:主题、上次更新和# Replies。 数据库表有以下列: id name body date topic_id
在mysql中解释的额外字段中你可以得到: 使用索引 使用where;使用索引 两者有什么区别? 为了更好地解释我的问题,我将使用下表: CREATE TABLE `test` ( `id` bi
我经常看到人们在其Haxe代码中使用关键字using。它似乎在import语句之后。 例如,我发现这是一个代码片段: import haxe.macro.Context; import haxe.ma
这个问题在这里已经有了答案: "reduce" or "apply" using logical functions in Clojure (2 个答案) 关闭 8 年前。 “and”似乎是一个宏,
这个问题在这里已经有了答案: "reduce" or "apply" using logical functions in Clojure (2 个答案) 关闭 8 年前。 “and”似乎是一个宏,
我正在考虑在我的应用程序中使用注册表模式来存储指向某些应用程序窗口和 Pane 的弱指针。应用程序的一般结构如下所示。 该应用程序有一个 MainFrame 顶层窗口,其中有几个子 Pane 。可以有
奇怪的是:。似乎a是b或多或少被定义为id(A)==id(B)。用这种方式制造错误很容易:。有些名字出人意料地出现在Else块中。解决方法很简单,我们应该使用ext==‘.mp3’,但是如果ext表面
我遇到了一个我似乎无法解决的 MySQL 问题。为了能够快速执行用于报告目的的 GROUP BY 查询,我已经将几个表非规范化为以下内容(该表由其他表上的触发器维护,我已经同意了与此): DROP T
我是一名优秀的程序员,十分优秀!