模块编写简单测试代码完成自动测试的方法和方法!!
文章目录测试功能
模块主要用于测试代码,这样您可以在编写自己的代码后使用脚本编写简单的测试代码完成自动测试。例如一个简单的函数,如下所示:
<p><pre> <code class="prism language-python"><span class="token keyword">def</span> <span class="token function">get_formatted_name</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''Generate a neattly formatted full name.'''</span>
full_name <span class="token operator">=</span> first <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> last
<span class="token keyword">return</span> full_name<span class="token punctuation">.</span>title<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
() 将名字和姓氏组合成一个名字,在名字和姓氏之间添加一个空格,将它们都大写,并返回结果。
接下来,要验证函数是否按预期工作,编写以下测试例程来测试函数的功能:
<p><pre> <code class="prism language-python"><span class="token keyword">from</span> name_func <span class="token keyword">import</span> get_formatted_name
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Enter 'q' at any time to quit."</span><span class="token punctuation">)</span>
<span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>
first <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">"\nPlease give me a first name:"</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> first <span class="token operator">==</span> <span class="token string">'q'</span><span class="token punctuation">:</span>
<span class="token keyword">break</span>
last <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">"Please give me a last name:"</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> last <span class="token operator">==</span> <span class="token string">'q'</span><span class="token punctuation">:</span>
<span class="token keyword">break</span>
format_name <span class="token operator">=</span> get_formatted_name<span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\nNeatly formatted name: "</span> <span class="token operator">+</span> formatted_name <span class="token operator">+</span> <span class="token string">"."</span><span class="token punctuation">)</span>
</code></pre></p>
执行结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_0.png
上面的方法只是自己输入参数并打印输出来检查是否正确的最简单的方法,但这太麻烦了。幸运的是,有一种自动测试函数输出的有效方式——模块方式。
单元测试和测试用例
还是用来测试上面的功能,创建测试用例进行单元测试,测试代码如下:
<p><pre> <code class="prism language-python"><span class="token keyword">import</span> unittest
<span class="token keyword">from</span> name_func <span class="token keyword">import</span> get_formatted_name
<span class="token keyword">class</span> <span class="token class-name">NamesTestCase</span><span class="token punctuation">(</span>unittest<span class="token punctuation">.</span>TestCase<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试 name_func.py '''</span>
<span class="token keyword">def</span> <span class="token function">test_first_last_name</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''能够正确处理姓名'''</span>
formatted_name <span class="token operator">=</span> get_formatted_name<span class="token punctuation">(</span><span class="token string">'janis'</span><span class="token punctuation">,</span> <span class="token string">'jopin'</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertEqual<span class="token punctuation">(</span>formatted_name<span class="token punctuation">,</span> <span class="token string">'Janis Jopin'</span><span class="token punctuation">)</span>
unittest<span class="token punctuation">.</span>main<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
在测试代码中,首先导入模块和测试函数对象()。创建一个名为包含一系列针对测试对象的单元测试的类(您可以随意命名该类)。这个类必须扩展 .class 以便它知道如何运行书面测试。
运行 .main() 的最后一行会导致该文件中的测试运行。结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_1.png
这 。(句点)在执行结果的第一行表示测试通过;下一行表示运行了一个测试,耗时不到 0.003 秒,最后的 OK 表示测试用例所有的单元测试都通过了。
在开发过程中,不可避免地要对原来写的功能进行修改,但是源代码修改后,之前版本的测试代码也需要做相应的修改。原函数修改如下:
<p><pre> <code class="prism language-python"><span class="token comment"># 添加中间姓名</span>
<span class="token keyword">def</span> <span class="token function">get_formatted_name</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> middle<span class="token punctuation">,</span> last<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''Generate a neattly formatted full name.'''</span>
full_name <span class="token operator">=</span> first <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> middle <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> last
<span class="token keyword">return</span> full_name<span class="token punctuation">.</span>title<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
再次执行刚才写的测试用例代码,显示结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_2.png
您可以看到显示的很多信息。
输出的第一行中的字母 E 表示测试用例中的一个单元测试导致了错误,并且以下输出表示中的 () 导致了错误。当一个测试用例包含许多单元测试时,知道哪个测试失败是至关重要的。显示输出后,弹出一个标准,指出函数测试错误的问题,这里是因为缺少必要的位置参数。
针对这个问题,我们其实可以把原来的功能修改成两个版本的兼容版本,如下:
<p><pre> <code class="prism language-python"><span class="token keyword">def</span> <span class="token function">get_formatted_name</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">,</span> middle <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''Generate a neattly formatted full name.'''</span>
<span class="token keyword">if</span> middle<span class="token punctuation">:</span>
full_name <span class="token operator">=</span> first <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> middle <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> last
<span class="token keyword">else</span><span class="token punctuation">:</span>
full_name <span class="token operator">=</span> first <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> last
<span class="token keyword">return</span> full_name<span class="token punctuation">.</span>title<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
在这个版本中,该函数既可以接收旧版本的三参数调用,也可以接收两参数调用,我们可以在原测试代码中添加新的测试用例,修改如下:
<p><pre> <code class="prism language-python"><span class="token keyword">import</span> unittest
<span class="token keyword">from</span> name_func <span class="token keyword">import</span> get_formatted_name
<span class="token keyword">class</span> <span class="token class-name">NamesTestCase</span><span class="token punctuation">(</span>unittest<span class="token punctuation">.</span>TestCase<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试 name_func.py '''</span>
<span class="token keyword">def</span> <span class="token function">test_first_last_name</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试两参数正确处理姓名函数'''</span>
formatted_name <span class="token operator">=</span> get_formatted_name<span class="token punctuation">(</span><span class="token string">'janis'</span><span class="token punctuation">,</span> <span class="token string">'jopin'</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertEqual<span class="token punctuation">(</span>formatted_name<span class="token punctuation">,</span> <span class="token string">'Janis Jopin'</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">test_first_middle_last_name</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试三参数正确处理姓名函数'''</span>
formatted_name <span class="token operator">=</span> get_formatted_name<span class="token punctuation">(</span><span class="token string">'janis'</span><span class="token punctuation">,</span> <span class="token string">'jopin'</span><span class="token punctuation">,</span> <span class="token string">'middle'</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertEqual<span class="token punctuation">(</span>formatted_name<span class="token punctuation">,</span> <span class="token string">'Janis Middle Jopin'</span><span class="token punctuation">)</span>
unittest<span class="token punctuation">.</span>main<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
执行这个新的测试用例会产生以下结果:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_3.png
从结果可以看出,测试用例通过了。
测试班
我已经解释了如何为单个函数编写测试python简单代码示例,但是作为面向对象的语言,存在更多的类,所以实际上更多的测试是针对类的。在编写和开发了一个新类之后,如何证明自己开发的新类可以正常工作或者可以使代码开发正常工作。
下一步是测试类。
各种断言方法
.class 中提供了很多断言方法。如前所述,断言方法可以检查应该满足的条件是否确实满足。如果确实满足了这个条件,那么关于程序行为的假设就得到了证实,并且可以保证中间的错误。如果条件没有真正满足,就会抛出异常。
以下是 6 种常用的断言方法。使用这些方法来验证返回值是否等于预期值,返回值是 True 还是 False,返回值是否在列表中。而且这些方法只能在继承自 .
方法使用
(一,乙)
验证 a == b
(一,乙)
验证 a != b
(X)
验证 x 是否为真
(X)
验证 y 是否为 False
(项目,清单)
验证项目是否在列表中
(项目,清单)
验证该项目不在列表中
编写要测试的类
我们写一个类进行测试,具体代码如下:
<p><pre> <code class="prism language-python"><span class="token keyword">class</span> <span class="token class-name">AnonymousSurvey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''收集匿名调查问卷的答案'''</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> question<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''存储一个问题,并为存储答案做准备'''</span>
self<span class="token punctuation">.</span>question <span class="token operator">=</span> question
self<span class="token punctuation">.</span>responses <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">def</span> <span class="token function">show_question</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''显示调查问卷'''</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>question<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">shore_response</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> new_response<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''存储单份调查问卷'''</span>
self<span class="token punctuation">.</span>responses<span class="token punctuation">.</span>append<span class="token punctuation">(</span>new_response<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">show_results</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''显示收集到的所有答案'''</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Survey results:"</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> response <span class="token keyword">in</span> self<span class="token punctuation">.</span>responses<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"- "</span> <span class="token operator">+</span> response<span class="token punctuation">)</span>
</code></pre></p>
该类首先需要存储一个指定的调查问题并创建一个空列表来存储答案。此类包含打印调查问题的方法、将新答案添加到答案列表的方法以及打印出存储在列表中的所有答案的方法。要创建这个类的一个实例,你需要做的就是提供一个问题,一旦你有了一个类对象的实例,你可以使用 () 来显示问题, () 来存储答案,和 () 来显示调查结果。
具体用法如下代码所示:
<p><pre> <code class="prism language-python"><span class="token keyword">from</span> survey <span class="token keyword">import</span> AnonymousSurvey
<span class="token comment"># 定义一个问题,并创建一个表示调查的 AnonymousSurvey 对象</span>
question <span class="token operator">=</span> <span class="token string">"What language did you first learn to speak?"</span>
my_survey <span class="token operator">=</span> AnonymousSurvey<span class="token punctuation">(</span>question<span class="token punctuation">)</span>
<span class="token comment"># 显示问题并存储答案</span>
my_survey<span class="token punctuation">.</span>show_question<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Enter 'q' at any time to quit.\n"</span><span class="token punctuation">)</span>
<span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>
response <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">"Language: "</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> response <span class="token operator">==</span> <span class="token string">'q'</span><span class="token punctuation">:</span>
<span class="token keyword">break</span>
my_survey<span class="token punctuation">.</span>store_response<span class="token punctuation">(</span>response<span class="token punctuation">)</span>
<span class="token comment"># 显示调查结果</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\nThank you to everyone who participated in the survey!"</span><span class="token punctuation">)</span>
my_survey<span class="token punctuation">.</span>show_results<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
执行结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_4.png
测试班
接下来针对这个类的各个方面的行为写一段测试代码,通过()来验证结果,具体代码:
<p><pre> <code class="prism language-python"><span class="token keyword">import</span> unittest
<span class="token keyword">from</span> survey <span class="token keyword">import</span> AnonymousSurvey
<span class="token keyword">class</span> <span class="token class-name">TestAnonmyousSurvey</span><span class="token punctuation">(</span>unittest<span class="token punctuation">.</span>TestCase<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''针对AnonymousSurvey类的测试'''</span>
<span class="token keyword">def</span> <span class="token function">test_store_single_response</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试单个答案会被妥善存储'''</span>
question <span class="token operator">=</span> <span class="token string">"What language did you first learn to speak?"</span>
my_survey <span class="token operator">=</span> AnonymousSurvey<span class="token punctuation">(</span>question<span class="token punctuation">)</span>
my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span><span class="token string">"English"</span><span class="token punctuation">)</span>
my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span><span class="token string">"Chinese"</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertIn<span class="token punctuation">(</span><span class="token string">"English"</span><span class="token punctuation">,</span> my_survey<span class="token punctuation">.</span>responses<span class="token punctuation">)</span>
unittest<span class="token punctuation">.</span>main<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
执行测试代码的结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_5.png
添加一个测试用例,修改如下:
<p><pre> <code class="prism language-python"><span class="token keyword">import</span> unittest
<span class="token keyword">from</span> survey <span class="token keyword">import</span> AnonymousSurvey
<span class="token keyword">class</span> <span class="token class-name">TestAnonmyousSurvey</span><span class="token punctuation">(</span>unittest<span class="token punctuation">.</span>TestCase<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''针对AnonymousSurvey类的测试'''</span>
<span class="token keyword">def</span> <span class="token function">test_store_single_response</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试单个答案会被妥善存储'''</span>
question <span class="token operator">=</span> <span class="token string">"What language did you first learn to speak?"</span>
my_survey <span class="token operator">=</span> AnonymousSurvey<span class="token punctuation">(</span>question<span class="token punctuation">)</span>
my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span><span class="token string">"English"</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertIn<span class="token punctuation">(</span><span class="token string">"English"</span><span class="token punctuation">,</span> my_survey<span class="token punctuation">.</span>responses<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">test_store_three_responses</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试三个答案会被妥善地存储'''</span>
question <span class="token operator">=</span> <span class="token string">"What language did you first learn to speak?"</span>
my_survey <span class="token operator">=</span> AnonymousSurvey<span class="token punctuation">(</span>question<span class="token punctuation">)</span>
responses <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'English'</span><span class="token punctuation">,</span> <span class="token string">'Chinese'</span><span class="token punctuation">,</span> <span class="token string">'Mandarin'</span><span class="token punctuation">]</span>
<span class="token keyword">for</span> response <span class="token keyword">in</span> responses<span class="token punctuation">:</span>
my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span>response<span class="token punctuation">)</span>
<span class="token keyword">for</span> response <span class="token keyword">in</span> responses<span class="token punctuation">:</span>
self<span class="token punctuation">.</span>assertIn<span class="token punctuation">(</span>response<span class="token punctuation">,</span> my_survey<span class="token punctuation">.</span>responses<span class="token punctuation">)</span>
unittest<span class="token punctuation">.</span>main<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
执行结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_6.png
方法 setUp()
在上一个测试类的多个测试用例的代码中,每个测试用例都会创建一个实例对象和对应的操作。实际上,.() 类中包含了 setUp() 方法天外神坛源码网,这样我们只需执行一次这些操作,并在以后的测试方法中使用。将上面的代码修改如下:
<p><pre> <code class="prism language-python"><span class="token keyword">import</span> unittest
<span class="token keyword">from</span> survey <span class="token keyword">import</span> AnonymousSurvey
<span class="token keyword">class</span> <span class="token class-name">TestAnonmyousSurvey</span><span class="token punctuation">(</span>unittest<span class="token punctuation">.</span>TestCase<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''针对AnonymousSurvey类的测试'''</span>
<span class="token keyword">def</span> <span class="token function">setUp</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''创建一个调查对象和一组答案,供测试用例使用'''</span>
question <span class="token operator">=</span> <span class="token string">"What language did you first learn to speak?"</span>
self<span class="token punctuation">.</span>my_survey <span class="token operator">=</span> AnonymousSurvey<span class="token punctuation">(</span>question<span class="token punctuation">)</span>
self<span class="token punctuation">.</span>responses <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'English'</span><span class="token punctuation">,</span> <span class="token string">'Chinese'</span><span class="token punctuation">,</span> <span class="token string">'Mandarin'</span><span class="token punctuation">]</span>
<span class="token keyword">def</span> <span class="token function">test_store_single_response</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试单个答案会被妥善存储'''</span>
self<span class="token punctuation">.</span>my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span>self<span class="token punctuation">.</span>responses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>assertIn<span class="token punctuation">(</span>self<span class="token punctuation">.</span>responses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>my_survey<span class="token punctuation">.</span>responses<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">test_store_three_responses</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''测试三个答案会被妥善地存储'''</span>
<span class="token keyword">for</span> response <span class="token keyword">in</span> self<span class="token punctuation">.</span>responses<span class="token punctuation">:</span>
self<span class="token punctuation">.</span>my_survey<span class="token punctuation">.</span>shore_response<span class="token punctuation">(</span>response<span class="token punctuation">)</span>
<span class="token keyword">for</span> response <span class="token keyword">in</span> self<span class="token punctuation">.</span>responses<span class="token punctuation">:</span>
self<span class="token punctuation">.</span>assertIn<span class="token punctuation">(</span>response<span class="token punctuation">,</span> self<span class="token punctuation">.</span>my_survey<span class="token punctuation">.</span>responses<span class="token punctuation">)</span>
unittest<span class="token punctuation">.</span>main<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></p>
执行结果如下:
http://tt.ccoox.cn/data/attachment/forum/20220124/1642955702156_7.png
可以看出python简单代码示例,两个测试都通过了,测试代码写的更精简了。
总结
在本文中,使用模块中的工具为函数和类编写测试,编写.,编写测试方法,并使用断言来验证函数和类的行为是否符合预期,从而确定测试是否通过。并使用setUp()方法高效地根据类创建实例并设置属性,使其可以在类的所有测试方法中使用,从而简化测试类代码的编写。
页:
[1]