欢迎回来｡
让我们来做一个有趣的小练习, 回顾一下我们以前写过的一段代码｡
还记得随机数猜谜游戏吗？我们必须猜一个1到10之间的数字｡
如果我运行这个文件, 你看到了吗？
它让我猜｡
所以我们说一, 二, 三, 四, 五, 六, 七, 八, 九.
我终于拿到号码了｡
你真是个天才｡
数字是九｡
那么我们如何测试这段代码呢？
现在, 你会注意到一件事, 这里我们并没有真正的函数｡
还记得我跟你们讲过函数式编程吗,
把代码分解成一小段函数, 这样做很好, 特别是纯函数.
这种心态的一大好处是, 您可以创建非常非常容易测试的代码｡
我们可以简单地给予函数一个输入并期望一个输出, 而不是在我们的测试中使用真正复杂的逻辑｡
这就是为什么我们有单元测试｡
单元测试的概念是我们测试每一个单元｡
这些单元测试是测试这些简单函数的小片段｡
所以我对你们的挑战是使用这段代码, 并试着把它分解成简单的函数｡
现在就去
在我们的例子中, 我希望我们只测试代码的这一部分, 也就是猜测部分, 在那里我们接收输入｡
这就是猜测, 然后用随机的答案进行测试, 我们应该会得到某种输出｡
所以要么我们输入一个数字｡
必须是1到10｡
如果我们做对了, 我们就得得到字符串｡
但这里的关键是我们可能要把它移到一个我们可以测试的函数中｡
我们可以忽略外界｡
把它分解成它自己的小功能｡
所以暂停视频并尝试一下｡
你将不得不克服一些障碍, 但这将真正考验你对测试的理解｡
-你好
真好笑
那是个双关语｡
所以暂停视频, 给予｡
否则, 我就直接回答了｡
我想做的第一件事是重新设置我的测试｡
我将导入单元测试, 并创建类测试main｡
或者这次我们称之为测试脚本或测试游戏｡
我会说单元测试｡
测试用例｡
这将是我们的测试案例｡
然后在这里我将创建一个简单的测试｡
游戏或测试输入｡
接收自我｡
现在, 我先不讲这个了因为我们什么都没做.
最后, 我会说如果｡
名字是因为两个main然后运行单元测试｡
点主要｡
这只是我们的简单设置｡
如果我们现在运行这个, 比如说Python 3｡
试验pi.
我们看到我们运行了一个测试｡
好吧, 我会的
这就是我们的计划
接下来, 我想做的是把它取出来, 这样我就可以在我的测试文件中使用它, 通过把它提取到一个函数中｡
所以我就在上面说｡
我来定义一下我们的猜测｡
游戏或者我们称之为逃跑｡
猜猜看
它将接收一个输入｡
或者我们猜一猜, 然后它会运行这个代码｡
那就这么办吧｡
我去拿｡
这段代码｡
就像这样｡
把它贴在这里｡
现在错误的猜测也需要答案变量｡
所以我要给予它第二个参数答案｡
就像这样｡
所以现在我可以简单地在这里里面｡
使用猜测和答案运行此函数｡
就像那样｡
因此, 让我们将其保存在此处并运行此测试, 或者只运行实际的文件以确保它仍在工作｡
哦, 我们得到了一点压痕在那里｡
所以我们必须确保缩进是正确的｡
因为记住在Python中, 这意味着什么｡
好吧, 我会的
现在我们有一个问题｡
我们在循环外有一个break, 因为当我们使用break这个关键字的时候, 我们现在在循环外｡
所以我们可以做的一件事就是返回这里｡
我们再来一遍｡
继续猜名字｡
或者一个数字｡
就这样｡
这个还能用｡
我可以在这里使用return, 因为这口井要运行并返回｡
但现在我们还在游戏中｡
也许我们可以回去｡
是的｡
并说如果｡
运行猜测｡
这是真的｡
我们要突围而出｡
再来一次｡
我们开始游戏吧
我将清除此选项, 然后重新运行游戏｡
一, 二, 三, 四｡
就这样｡
我输入了一个数字｡
我是个天才｡
我们刚结束比赛｡
让我们把它做小一点, 这样你就能看到了｡
所以我们有我们的运行｡
我想我修改了一下代码｡
但关键的是我提取了一个功能单元, 这样我就可以测试像Run这样的东西｡
猜猜看
看起来我已经修改了我们的代码, 但是代码仍然可以工作｡
现在, 让我们开始测试run guess函数｡
我们到这里来
开始导入我们的脚本｡
在这里做一些事情｡
首先, 我想知道答案, 比如说, 等于5｡
猜测结果是5｡
所以我们要确保如果猜测和答案匹配, 那么, 错误的访客会通过if语句,
打印出你是天才, 或者非case返回true｡
所以我们说self. assert｡
平等｡
这个脚本还是第一次让我们运行它｡
所以让result等于script.
是什么？
跑, 猜｡
快跑啊
猜猜看
并给予它答案｡
猜猜看｡
我们期望结果｡
返回｡
是的｡
所以我们只能说断言真的那个｡
结果是真的｡
如果我现在运行这个｡
哦, 我们实际上开始了游戏｡
那我们该怎么解决这个问题？
我们可以关闭它, 然后添加if名称Main｡
在这里｡
所以在这里｡
我们会说, 嘿, 只有当这是主文件时才运行它｡
如果我回到这里再测试一次｡
好吧, 我会的
现在它可以工作了, 但是我得到了一个断言错误, 测试游戏对象没有属性assert true, 因为｡
好我｡
拼错了｡
我们再来一次｡
好吧, 我会的
它看起来像一个测试运行和一切都很好｡
我们还看到它打印出来了｡
你真是个天才｡
非常非常好｡
顺便说一句, 我向你们展示这种测试方式是因为这是真实的场景的样子｡
你不断地破坏东西, 不断地犯错误, 然后你试图修复它们, 纠正你的代码｡
您可以看到, 仅仅通过运行这些测试, 我们的代码就已经越来越好了｡
好吧, 我会的
我们还能做什么？
就说这里吧｡
我们要复制这个｡
为了缩短时间, 我直接在这里输入参数｡
就像那样｡
比如说输入, 比如说不正确｡
或者｡
猜错了｡
假设答案是5, 我猜是0｡
所以我们要断言这等于假｡
所以如果我运行这个｡
测试他们的传球｡
这是真棒｡
我们还能测试什么？
好吧, 我会的
我们要检验这个猜测是否在0和10之间或者1和10之间.
这样的话, 我们想打印一份｡
嘿, 笨蛋｡
我说的是1到10｡
所以我再一次可以测试｡
那如果我猜错了｡
号码｡
假设答案是5, 但我给予11｡
我们要断言｡
好吧, 现在我们正在打印, 什么也不做｡
所以也许我们应该返回false来保持一致性｡
如果我再这么做然后逃跑｡
你去那里｡
三项测试通过｡
那太好了｡
还有很多很多测试我们可以写｡
也许让我们再做一次试验, 也就是试验｡
如果输入是一个字符串呢？
如果我运行这个｡
哦, 我的天
并确定错了｡
在此输入｡
请确保名称不同｡
我有四个测试在运行｡
因为它不会通过, 它会返回false｡
现在我们可以做更多的事情｡
但你现在就能看到测试的力量｡
如果你们的测试和我不同, 没关系, 各位｡
测试用例是不同的｡
测试的全部意义就是简单地｡
看看我们的代码, 看看我们如何改进它, 我们如何打破我们的代码,
我们如何简化我们的代码, 通过把它分成更小的单元, 更小的单元, 可以测试和修复一些错误, 也许我们想已经想到了｡
现在我们可以做更多的事情, 但是你会注意到这个想法是如何一次做一小块的｡
测试它, 然后我们可以进一步查看代码的这一部分, 或者代码的尝试和接受部分｡
事情是这样的｡
当你在一家公司工作时, 我认为你可以做无数的测试｡
您可以在这里使用数百行代码来测试您的代码｡
但是, 仅仅因为你尽可能多地进行测试, 并不能真正使你的测试很好｡
就像我说的, 你可以编写无数个测试｡
这个想法是写到高质量的测试, 涵盖了你的大多数情况｡
但是最终你会有递减的回报, 你必须在写代码和写测试之间进行权衡｡
有时候, 根据工作的需要, 您可能需要更多地关注测试, 而不是代码｡
或者, 有时候您需要快速移动, 而没有时间编写测试｡
同样, 根据业务需要, 也可能是这种情况｡
但是通过这一部分, 我希望您能够理解软件开发中测试的一些原则｡
也就是说, 我们的代码中总是会出现bug｡
我们可以用灯光来帮助我们｡
但是确保我们的代码正常工作的最好方法之一是测试｡
测试的次数越多, 通常意味着代码越稳定｡
下次见｡
再见, 再见, 再见