Я написал Test Automation Framework. Каркас строится вокруг объектов и действий. Объект может быть текстовым полем. Действия для него могут быть такими, как set-text, clear, verify-text, verify-enabled и т. Д. Каркас не зависит от acitons, поэтому мы можем добавлять больше действий с течением времени без необходимости повторного использования самой каркаса. Я рассмотрел два подхода к действиям. Первым было использовать шаблон команды. В этом случае у меня будет интерфейс, который выглядит примерно так:
public interface IAction
{
void Execute(StringDictionary properties);
}
Проблема в том, что в итоге мы получим множество этих командных классов.
public class SetTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}
public class ClearAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}
public class VerifyTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}
public class VerifyEnabledAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}
Кроме того, любой общий код должен быть в другом классе. Похоже, что в коде увеличивается отношение шума к сигналу.
Альтернатива, которую я предложил, состоит в том, чтобы использовать служебный класс для типа и методы для действий. Это в конечном итоге выглядит так:
public class TextboxActions
{
public static void set-text(StringDictionary properties)
{
}
public static void clear(StringDictionary properties)
{
}
public static void verify-text(StringDictionary properties)
{
}
public static void verify-enabled(StringDictionary properties)
{
}
}
Преимущество в том, что код для текстовых полей все вместе. Кроме того, любой код, который является общим для нескольких действий, может быть в одном классе. К сожалению, этот подход требует, чтобы я использовал рефлексию, чтобы «найти» метод действия. Очевидно, что это небезопасно и может занимать много времени. Это достаточно медленно, поэтому я добавил кеш, поэтому мне не нужно дважды искать одно и то же действие, но это увеличивает сложность кода.
Любое из этих решений работает, но оба они имеют нежелательные характеристики. Есть ли альтернативный подход к этой проблеме, который кто-то может предложить?