UML类图 参与者 参与的类和对象 我 mproved 行为研究设计P attern 是: IBehaviou - [R -定义为所有行为的接口。只包含一个 执行 方法。 AssertBehaviour -所有只断言行为的基类。包含两个方法- 断言 和 执行 。 ActionBehaviour -一切行动只行为的基类。只
UML类图
参与者
参与的类和对象我mproved 行为研究设计P attern是:
-
IBehaviou - [R -定义为所有行为的接口。只包含一个执行方法。
-
AssertBehaviour -所有只断言行为的基类。包含两个方法- 断言和执行。
-
ActionBehaviour -一切行动只行为的基类。只包含两个方法PerformAct和执行。
-
WaitableActionBehaviour -为可以同时包含行动,声称等待所有的逻辑更复杂的行为基类。
-
UnityContainerFactory -创建并保持一个单一的全球实例为Unity IoC容器类。
-
ItemPageNavigationBehaviour -为ItemPage类的具体行为。它拥有一个导航逻辑。它是一个行动的行为。
-
ItemPage -一个具体的网页对象,它提供了可以在页面上进行不同的服务操作。它是在特定的行为使用。
-
BehaviourExecutor -它是执行行为'的工作流的列表中的类。
什么是我们尝试解决问题?
在前面的例子中,有一个主要问题,这是不能适当的参数传递到的行为。它们都依赖于一个静态的测试上下文类。正如你可能知道的,静态的使用是不是最好的做法。在我看到的另一个问题是,工作流的定义中ExecutionEngine是有点不灵活。如果需要添加一个新的步骤,要适用于几乎所有的测试依赖于主类的变化。我想提高测试的灵活性。
行为研究设计模式C#代码
之一相比前述实施例的主要区别在于,IBehaviour接口只包含一个于方法执行。
IBehaviour接口更改
|
public interface IBehaviour |
|
{ |
|
void Execute(); |
|
} |
|
查看原始IBehaviour.cs主办的GitHub
另一个主要区别是,有基础上,他们需要在行为设计图案的该变化来解决使用案例多个基行为类。有一个动作的,并且断言,只有类。我相信,这会导致更好的面向对象设计,而不是仅重写所提供的方法的一部分。
操作只基类
|
public abstract class ActionBehaviour : IBehaviour |
|
{ |
|
public void Execute() |
|
{ |
|
this.PerformAct(); |
|
} |
|
|
|
protected abstract void PerformAct(); |
|
} |
|
查看原始ActionBehaviour.cs主办的GitHub
断言只有基类
|
public abstract class AssertBehaviour : IBehaviour |
|
{ |
|
public void Execute() |
|
{ |
|
this.Assert(); |
|
} |
|
|
|
protected abstract void Assert(); |
|
} |
|
查看原始AssertBehaviour.cs主办的GitHub
可等待行动基地班
|
public abstract class WaitableActionBehaviour : IBehaviour |
|
{ |
|
public void Execute() |
|
{ |
|
this.PerformAct(); |
|
this.PerformPostActWait(); |
|
} |
|
|
|
protected abstract void PerformAct(); |
|
|
|
protected abstract void PerformPostActWait(); |
|
} |
|
查看原始WaitableActionBehaviour.cs主办的GitHub
当您需要执行的操作,然后等待的东西,例如,等待页面加载或一个元素成为可见的类是很有用的。
可等待Assertable行动基地班
|
public class WaitableAssertableActionBehaviour : IBehaviour |
|
{ |
|
public void Execute() |
|
{ |
|
this.PerformPreActWait(); |
|
this.PerformPreActAssert(); |
|
this.PerformAct(); |
|
this.PerformPostActAssert(); |
|
this.PerformPostActWait(); |
|
this.PerformPostActWaitAssert(); |
|
} |
|
|
|
protected virtual void PerformPreActWait() |
|
{ |
|
} |
|
|
|
protected virtual void PerformPreActAssert() |
|
{ |
|
} |
|
|
|
protected virtual void PerformAct() |
|
{ |
|
} |
|
|
|
protected virtual void PerformPostActAssert() |
|
{ |
|
} |
|
|
|
protected virtual void PerformPostActWait() |
|
{ |
|
} |
|
|
|
protected virtual void PerformPostActWaitAssert() |
|
{ |
|
} |
|
} |
|
查看原始WaitableAssertableActionBehaviour.cs主办的GitHub
类几乎是相同的,从前述实施例的那些,因为它太复杂,并且包含在它的所有可能的工作流的步骤。建议只有当你无法使用其他一些可用的基本行为的类使用它。
项目页面导航行为重构的
现在的行为接受需要itemUrl作为构造函数的参数。从属ItemPage中未解决的BehavioursExecutor而是在行为本身通过的帮助UnityContainerFactory提供的统一IoC容器的当前实例的类。行为只需要导航到单个页面,因为它实现了简单ActionBehaviour基类。
|
public class ItemPageNavigationBehaviour : ActionBehaviour |
|
{ |
|
private readonly ItemPage itemPage; |
|
private readonly string itemUrl; |
|
|
|
public ItemPageNavigationBehaviour(string itemUrl) |
|
{ |
|
this.itemPage = UnityContainerFactory.GetContainer().Resolve<ItemPage>(); |
|
this.itemUrl = itemUrl; |
|
} |
|
|
|
protected override void PerformAct() |
|
{ |
|
this.itemPage.Navigate(this.itemUrl); |
|
} |
|
} |
|
查看原始ItemPageNavigationBehaviour.cs主办的GitHub
UnityContainerFactory
它是一个包含一个静态方法的静态类GetContainer返回统一IOC容器的当前实例。它也可以被实现为单。
|
public static class UnityContainerFactory |
|
{ |
|
private static IUnityContainer unityContainer; |
|
|
|
static UnityContainerFactory() |
|
{ |
|
unityContainer = new UnityContainer(); |
|
} |
|
|
|
public static IUnityContainer GetContainer() |
|
{ |
|
return unityContainer; |
|
} |
|
} |
|
查看原始UnityContainerFactory.cs主办的GitHub
登录页面登录行为重构的
这些变化是几乎相同的应用到的那些ItemPageNavigationBehaviour除了类继承WaitableActionBehaviour。它覆盖了PerformPostAc TWAIT方法,在那里等待送货地址页面加载。
|
public class SignInPageLoginBehaviour : WaitableActionBehaviour |
|
{ |
|
private readonly SignInPage signInPage; |
|
private readonly ShippingAddressPage shippingAddressPage; |
|
private readonly ClientLoginInfo clientLoginInfo; |
|
|
|
public SignInPageLoginBehaviour(ClientLoginInfo clientLoginInfo) |
|
{ |
|
this.signInPage = |
|
UnityContainerFactory.GetContainer().Resolve<SignInPage>(); |
|
this.shippingAddressPage = |
|
UnityContainerFactory.GetContainer().Resolve<ShippingAddressPage>(); |
|
this.clientLoginInfo = clientLoginInfo; |
|
} |
|
|
|
protected override void PerformPostActWait() |
|
{ |
|
this.shippingAddressPage.WaitForPageToLoad(); |
|
} |
|
|
|
protected override void PerformAct() |
|
{ |
|
this.signInPage.Login(this.clientLoginInfo.Email, this.clientLoginInfo.Password); |
|
} |
|
} |
|
查看原始SignInPageLoginBehaviour.cs主办的GitHub
简化BehaviourExecutor
现在并无持有任何复杂的逻辑的执行者,它仅包含一个执行接受的行为“的工作流程的一个阵列的方法。
|
public static class BehaviourExecutor |
|
{ |
|
public static void Execute(params IBehaviour[] behaviours) |
|
{ |
|
foreach (var behaviour in behaviours) |
|
{ |
|
behaviour.Execute(); |
|
} |
|
} |
|
} |
|
查看原始BehaviourExecutor.cs主办的GitHub
在行为研究试验设计模式
|
[TestMethod] |
|
public void Purchase_SimpleBehaviourEngine() |
|
{ |
|
var itemUrl = "/Selenium-Testing-Cookbook-Gundecha-Unmesh/dp/1849515743"; |
|
var itemPrice = "40.49"; |
|
var clientPurchaseInfo = new ClientPurchaseInfo( |
|
new ClientAddressInfo() |
|
{ |
|
FullName = "John Smith", |
|
Country = "United States", |
|
Address1 = "950 Avenue of the Americas", |
|
State = "New York", |
|
City = "New York City", |
|
Zip = "10001-2121", |
|
Phone = "00164644885569" |
|
}); |
|
clientPurchaseInfo.CouponCode = "99PERDIS"; |
|
var clientLoginInfo = new ClientLoginInfo() |
|
{ |
|
Email = "g3984159@trbvm.com", |
|
Password = "ASDFG_12345" |
|
}; |
|
BehaviourExecutor.Execute( |
|
new ItemPageNavigationBehaviour(itemUrl), |
|
new ItemPageBuyBehaviour(), |
|
new PreviewShoppingCartPageProceedBehaviour(), |
|
new SignInPageLoginBehaviour(clientLoginInfo), |
|
new ShippingAddressPageFillShippingBehaviour(clientPurchaseInfo), |
|
new ShippingAddressPageFillDifferentBillingBehaviour(clientPurchaseInfo), |
|
new ShippingAddressPageContinueBehaviour(), |
|
new ShippingPaymentPageContinueBehaviour(), |
|
new PlaceOrderPageAssertFinalAmountsBehaviour(itemPrice)); |
|
} |
|
查看原始AmazonPurchaseTests.cs主办的GitHub
相比之前的变化,可以发现一些显著的变化。首先,你需要通过传递行为的新的运 营商,并传递任何必需的参数。此前,通过你传递的行为typeof操作符。你不再有义务初始化静态测试环境。我相信这些变化做出的测试更加灵活,可读性和可维护性。