场景需要
在刷OJ的过程中,最常见的就是从stdin里面读取输入了,然后把结果输出到stdout上供OJ判断结果。
一般来说,在本地写完程序之后都会手动输入一遍test case,观察输出结果之后发现不对劲,再手动输入一遍test case。。。
作为一个搞笑的程序员,啊呸,不是,高效的程序员,简直不能忍受一次又一次地手动输入test case,能不能每次debug完之后一键跑数据呢?而且能不能让自己额外想出来的test case保存下来,每次都跑一遍呢?
由于我现在主要是使用Python刷OJ,因此很自然地想到了通过Python Mock来模拟stdin。
例子
以我最近的刷的PAT 1002 A+B for Polynomials (25) Python为例,要完整的模拟整个OJ测试过程主要从两个方面入手,输入和输出。
模拟输入
在Python从console读取输入主要是通过input函数,那么通过一个Mock对象代替掉input函数即可。但是input函数是一个内置函数,怎么Mock呢?
在Python3中,如果要标记内置函数,可以通过builtins包导入;在Python2中,则是通过__builtin__包导入。
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import builtins
>>> builtins.input
<built-in