Codeacademyで基本的なバイオインフォマティクスコースを作成したいと思っています。コースを作成するための優れたインターフェイスがありますが、保存してからプレビューしてから実行する必要があるため、テストには少し時間がかかります。
だから私は彼らの環境を模倣した小さなテスト環境を書きたいと思っています。ユーザー入力コードが文字列として関数に読み込まれstr
、コード内のすべてのインスタンスが変換されunicode
(これには正規表現を使用しました)、コードがで実行されるように見えますexec
。
トリッキーな部分は、提出テストを組み込みたい場合のようです。
送信テストは、、、またはを返す必要がTrue
ありFalse
、str
関数の本体として記述されます。したがって、たとえば:
私がやろうとしていることの簡略版:
# The submission test must be a function.
def test_code(code, CC, error):
# Use information from errors in student code
if error:
return "Yada yada %s" %error
# Use information in the raw student code
if len(code.split("\n")) is not 2:
return "This should be accomplished in 2 lines"
# Have direct access to variables from the student code
# I'd like to avoid params['y'] if possible.
try:
y
except NameError:
return "Please use the variable y"
if y is not 8:
return "Wrong! Check stuff"
# Use information from print output
if str(y) not in CC:
return "Remember to print your variable!"
return True
# Read in student code
student_code = """y = 8
print y
potato"""
# Catch print output
CC = StringIO.StringIO()
sys.stdout = CC
# Execute student code and catch errors
try:
exec student_code
except Exception as e:
error = e
# Start outputting to the terminal again
sys.stdout = sys.__stdout__
# Run the submission test
submission_test = test_code(student_code, CC.split("\n"), error)
# Output the result of the submission test
if submission_test is True:
print("Well done!")
elif submission_test is False:
print("Oops! You failed... Try again!")
else:
print(submission_test)
ただし、変数を取得して送信テスト関数(この場合)exec code
に渡すことができないようです。test_code
提出テストでコードを実行することもできますが、可能であればそれを避けたいと思います。そうしないと、各テストにコードを追加する必要があります。
どんな助けでも大歓迎です:)