«тогда я на самом деле не проверяю все, что может пойти не так».
Правильно.
Работа модульных тестов заключается в , а не , чтобы проверить все, что может пойти не так.
Работа модульных тестов состоит в том, чтобы проверить, что то, что у вас есть, делает правильно , учитывая конкретные входные данные и конкретные ожидаемые результаты. Важной частью здесь являются конкретные видимые, внешние требования удовлетворяются конкретными тестовыми примерами. Не то, чтобы все возможные вещи, которые могли пойти не так, как-то предотвращались.
Ничто не может проверить все, что может пойти не так. Вы можете написать доказательство, но вам будет сложно написать тесты для всего .
Выбирайте свои тесты с умом.
Кроме того, работа модульных тестов состоит в том, чтобы проверить, что каждая небольшая часть общего приложения делает правильные вещи - в изоляции.
Например, ваш «код, аппроксимирующий кривую с кривой с более низким разрешением», вероятно, имеет несколько небольших частей, которые можно протестировать как отдельные блоки. В изоляции. Интегрированное целое также может быть проверено, чтобы убедиться, что оно работает.
Например, ваша «вычислительная работа на кривой с более низким разрешением», вероятно, состоит из нескольких небольших частей, которые можно протестировать как отдельные модули. В изоляции.
Эта цель модульного тестирования заключается в создании небольших, правильных блоков, которые позже собираются.
с использованием Iron Python 2.6 RC 2 и C # 3.5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
namespace IPmemTest {
class IPy {
private string script = "import random; random.randint(1,10)";
public IPy() {
}
public void run() {
//set up script environment
Dictionary<String, Object> options = new Dictionary<string, object>();
options["LightweightScopes"] = true;
ScriptEngine engine = Python.CreateEngine(options);
ScriptRuntime runtime = engine.Runtime;
ScriptScope scope = runtime.CreateScope();
var source = engine.CreateScriptSourceFromString(this.script);
var comped = source.Compile();
comped.Execute(scope);
runtime.Shutdown();
}
}
}
и мой цикл
class Program {
static void Main(string[] args) {
while (true) {
var ipy = new IPy();
ipy.run();
}
}
}
использование памяти увеличивается примерно до 70 000 КБ, но затем стабилизируется.
Вы пробовали запустить Iron python в его собственном домене приложений? Python.CreateEngine позволяет вам передать ему AppDomain, который затем может быть выгружен, когда сценарий завершится.
Или, на основе этого обсуждения, используйте опцию LightweightScopes, например
Dictionary<String, Object> options = new Dictionary<string, object>();
options["LightweightScopes"] = true;
ScriptEngine engine = Python.CreateEngine(options);
ScriptRuntime runtime = engine.Runtime;