title: Emulating user input in python for testing
body: <p>I have written a simple python program that takes user input, with the use of input(). There are some different commands available.</p>
  
  <p>I want to make sure that all available commands function as intended and that the program catches invalid commands. Since there are quite a few different commands, this is very time-consuming to do manually (i.e., start the program, and enter all commands, one by one). (I have separate test functions for the actual execution of all commands, but I'm struggling to find a nice way to test this functionality together with the input() loop.)</p>
  
  <p><strong>How can I automate the process of giving (predetermined) user inputs, without messing up the rest of the code?</strong> In addition to using this to test the program, it would also serve as an example to the user, in order to see the possible usage of the program.</p>
  
  <p>My current solution is that I have two versions of the main() function, which is basically just an infinite loop that takes inputs until an exit command is given. The first version, "main()", is the version intended for use and takes inputs from input(), until the user decides to quit. The second version, "main_test()" is only used for testing, and takes the inputs from a predetermined list, specified in the code. This does the job, but I do not want the main_test() code in the final version. I also do not want to "pollute" main() by adding things only used for testing.</p>
  
  <pre><code>def main():
      while True:
          user_input = input()
          ...
  def main_test():
      test_input = [...]
      test_iter = 0
      while True:
          user_input = test_input[test_iter]
          test_iter += 1
          ...
  </code></pre>
  
  <p>I have not been able to find a nice way to do this in python, although I'm sure there must be a smart way. I'd prefer a way that does not need any additional imports. But if there is a nice way to do it with additional imports, I'm all ears.</p>
  
  <p>Anyway, striking out with python, my next thought was to specify the commands in a Makefile, where I would start the program and feed the program text input, emulating the user. The main benefit of this is that I would only need the "main()" function, and I would not have to change anything in the python code. The disadvantage is that the example/test is specified outside of the *.py files, which may confuse the user.</p>