欢迎回来｡
现在让我们编写第一个测试｡
我们将在这个程序中运行一个简单的函数｡
我们将在主文件中创建一个, 比如说, 让它稍微大一点｡
我们会说我们有一个函数叫做do stuff｡
是的, 非常具有描述性的功能｡
在这里, 我们只接受一个数字｡
我们只返回num加5｡
一个非常非常简单的函数｡
假设这是构建应用程序的代码｡
这只是一个功能｡
但是假设, 我们有很多函数要测试, 因为这些都是我们要在代码中执行的操作｡
单元测试的工作方式｡
是这样的｡
我们有了测试文件, 在导入单元测试后, 我们想导入我们要测试的文件, 在我们的例子中, 它是main
py｡
所以我们就导入吧｡
主缐
就在这里｡
或者, 如果需要, 我们也可以导入函数｡
但在我们的例子中, 假设我们有很多函数, 所以我们可以导入main并使用那里所有可用的函数｡
现在单元测试的工作方式是我们创建一个类, 然后给它命名, 随便你想要什么｡
在这里我们将进行所有的测试｡
所以我们就称之为Test Main｡
我们在这个类中继承了单元测试给我们的东西, 这是一个测试｡
所以这只是一种使用单元测试的标准方法｡
因此, 我们继承了单元测试用例, 现在我们在测试主类中有了可用的功能｡
现在, 我们可以在这里开始测试并编写代码进行测试｡
那么我们如何测试main呢？
做东西的功能｡
我们简单地说, 让我们在这里写一个函数或者一个方法, 因为这是类的一部分, 然后说, 嘿,
我想测试, 做一些事情｡
而在这里它将接受自我｡
在这里, 我可以测试我的代码, 如果这里的数字等于10, 我就给它一个随机数｡
然后我会说, 结果将等于主点做的东西｡
记住, do是来自缅因州的, 这是我们要测试的函数.
所以我想运行do stuff函数, 在这里给予出参数num, 我刚才已经给出了, 或者我们把这个叫做test
param.
这个测试参数, 我们将运行代码, 并得到结果｡
而这最后一行是单元测试的关键部分｡
单元测试允许我们说self点, assert equal, assert equal是我们从单元测试继承的东西,
assert equal说嘿assert｡
或者确保这两个参数相等｡
在我们的例子中, 我想测试一下, 结果等于, 在我们的例子中, 十｡
加5应该等于15｡
好吧, 我会的
现在, 终于到了这里, 我们只需要运行单元测试｡
以及我们运行单元测试的方式, 因为这只是我做的一个测试｡
我可以做多个测试｡
我们需要说的只是单元测试. main｡
它将在测试主目录中运行整个测试文件｡
现在, 如果我现在运行这个程序, 我所要做的就是说Python 3, 我的命令行, 然后说Test, 点pi｡
而我得到｡
OC在0秒内以超快的速度在油井中进行了一次测试｡
动作又快又好｡
现在假设我做了其他的事情, 我断言equal, 这等于10｡
如果我运行这个｡
看那个｡
我失败了？
什么失败？
嗯, 测试做功能失败了｡
八号线｡
所以这里我们有一个断言错误｡
我们得到了15, 但我们期待10｡
这很酷吧？
现在我有一个错误, 所以我需要修复我的代码｡
所以这里有点不对劲｡
现在, 在我的例子中, 这是因为我断言｡
B 15的答案｡
但如果我们在这里再做一个测试呢？
过牌｡
嘿, 如果我们也有测试做的东西｡
这一次测试程序实际上是一段字符串｡
那么我们希望函数做什么呢？
在我们的例子中, 它可能会给我们一个错误, 可能是一个值错误｡
所以我只说价值｡
因为这是行不通的｡
如果我现在运行这个, 让我们清除这个｡
如果我现在运行这个｡
好吧, 我有两个测试｡
但是我有一个继承人, 我看到这里有一个继承人说, 嘿, 我得到一个打字员,
只能连接字符串, 而不是八个｡
现在, 在这种情况下, 什么实际上失败了？
是测试文件, 因为我们刚才做的实际上是函数失败｡
但马上｡
我看到了｡
好吧, 我会的
好吧, 这是我们需要解决的问题, 这样我就可以回到缅因州, 然后说, 嘿,
我想确保我们捕捉到任何错误｡
例如类型错误或值错误｡
所以我能做的第一件事就是说不是｡
号码｡
如果我保存它, 确保我们把它转换成整数, 然后我运行这个｡
好了, 现在我得到了一个值错误, 所以它不能在这段字符串上运行｡
好的, 我们可以做的另一件事就是改进代码, 把它包装在try中, 除了块写入, 然后我们可以捕获｡
所以我们说除了｡
在这里接受一个值错误｡
比如说错误｡
在这里, 我们可以为所欲为｡
所以如果我们想要错误, 我们可以返回, 甚至可以提高空气｡
在我们的情况下, 让我们只是返回空气｡
我马上告诉你为什么｡
如果我运行这个｡
您可以看到我的测试失败了, 但现在它实际上是一个断言错误｡
断言错误来自我们的测试文件, 我断言, 嘿,
我想确保结果和错误值相等｡
现在你可以看到这里有一点不匹配｡
我们这里有一个值的误差, 不等于类的值的误差｡
这是一个小技巧, 因为我们返回了一个错误｡
它实际上是值错误类的一个实例｡
所以我们需要做这样的事情｡
我们要说的, 嘿, 是实例｡
说, 这是什么一个实例？
那么, result是这样一个值错误的实例吗？
但问题就在这里｡
就是让我们把它放大一点｡
这里的问题是assert equals需要两个参数, 两个必须相等的参数.
但这里我只想确保它返回true, 结果是一个值错误的实例｡
那我该怎么做呢？
除了assert equal之外, 单元测试还提供了一些其他方法｡
如果我在单元测试文档的第一行看到了assert方法的列表｡
所以这里我看到这些都是断言和测试我们代码的方法｡
我们可能需要的是这个断言真｡
检查某事是否属实｡
所以如果我断言｡
这是真的｡
我做了测试｡
让我们清除这个并再次运行我的测试｡
你去那里｡
我做了两次检查一切正常｡
再一次, 来回顾一下这个｡
为什么会这样呢？
我在运行测试文件｡
然后我会进行测试, 做一些没问题的事情｡
然后我做第二部分, 测试参数是我们并不需要的, 它只是一个字符串.
结果会给予我们一个值错误, 因为我们已经捕获了这个错误, 现在我们要返回这个错误.
最后, 我们运行这段代码｡
嘿, 这是真的吗？
结果会是值错误吗？
所以你知道我们在做什么｡
我们通过测试所做的就是通过简单地尝试打破它来改善我们的功能｡
所以我们要把函数分解, 看看, 我能不能把函数分解成一个空气？
一旦你这样做了, 测试失败了, 你就回到一个函数, 试图修复它｡
有点像我们在这里做的, 这真的, 真的很酷｡
这是一个常见的测试实践, 你试图打破的东西, 直到, 嗯, 功能变得完美｡
现在, 我希望您在这里花点时间, 看看是否可以打破这个函数, 也许可以在下一个视频中添加一些测试｡
我将添加更多的函数, 以使此函数更好｡
下次见｡