Встроенная утечка памяти IronPython

«тогда я на самом деле не проверяю все, что может пойти не так».

Правильно.

Работа модульных тестов заключается в , а не , чтобы проверить все, что может пойти не так.

Работа модульных тестов состоит в том, чтобы проверить, что то, что у вас есть, делает правильно , учитывая конкретные входные данные и конкретные ожидаемые результаты. Важной частью здесь являются конкретные видимые, внешние требования удовлетворяются конкретными тестовыми примерами. Не то, чтобы все возможные вещи, которые могли пойти не так, как-то предотвращались.

Ничто не может проверить все, что может пойти не так. Вы можете написать доказательство, но вам будет сложно написать тесты для всего .

Выбирайте свои тесты с умом.

Кроме того, работа модульных тестов состоит в том, чтобы проверить, что каждая небольшая часть общего приложения делает правильные вещи - в изоляции.

Например, ваш «код, аппроксимирующий кривую с кривой с более низким разрешением», вероятно, имеет несколько небольших частей, которые можно протестировать как отдельные блоки. В изоляции. Интегрированное целое также может быть проверено, чтобы убедиться, что оно работает.

Например, ваша «вычислительная работа на кривой с более низким разрешением», вероятно, состоит из нескольких небольших частей, которые можно протестировать как отдельные модули. В изоляции.

Эта цель модульного тестирования заключается в создании небольших, правильных блоков, которые позже собираются.

8
задан cgyDeveloper 3 November 2009 в 00:31
поделиться

2 ответа

с использованием 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 КБ, но затем стабилизируется.

6
ответ дан 5 December 2019 в 17:38
поделиться

Вы пробовали запустить 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;
4
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: