现在是介绍最后一个SOLID原则的时候了!依赖性倒置原则由两部分组成,我们将逐一进行介绍。首先,该原则指出“高级模块不应该依赖于低级模块,而应该依赖于抽象。”
为了理解这一点,我们首先需要知道“高级模块”和“低级模块”之间的区别。“低级模块”是处理特定任务的模块,例如从数据库发出请求或将文件发送到打印机。在这篇文章的第一个例子中,我们将使用一个名为“AddText”的类,它将清除一个文本字段并在其中输入新的文本:
class AddText {
clearAndEnterText(id: string, value: string) {
driver.findElement(By.id(id)).clear().sendKeys(value)
}
}
“高级模块”是指为应用程序或测试提供核心功能的东西,例如生成报告或创建新用户。在这个例子中,我们将使用一个名为“UpdatePerson”的类来更新Person记录中的值:
class UpdatePerson {
private addText: AddText
constructor(addText: AddText) {
this.addText = addText
}
update(updateId: string, updateValue: string) {
this.addText.clearAndEnterText(updateId, updateValue)
}
}
在这个例子中,我们更新记录的方法是首先初始化一个 AddText 类的实例,然后初始化一个 UpdatePerson 类的实例,再调用update函数进行更新:
const addText = new AddText()
const updateUser = new UpdatePerson(addText)
updateUser.update('lastName', 'Smith')
但是这个例子违反了依赖性倒置原则!UpdatePerson类非常依赖于AddText类。如果在“AddText”类中的“clearAndEnterText”函数的签名(参数和返回类型)发生变化,那么“UpdatePerson”类也必须相应地改变。
因此,让我们按照原则更新代码。我们将创建一个名为“AddText”的接口,而不是创建一个“AddText”类:
interface AddText {
clearAndEnterText(id: string, value, string): void
}
然后创建一个名为“PersonForm”的类,来实现这个接口:
class PersonForm implements AddText {
clearAndEnterText(id: string, value: string) {
driver.findElement(By.id(id)).clear().sendKeys(value)
}
}
最后,更新UpdatePerson类,让它使用PersonForm:
class UpdatePerson {
private form: PersonForm
constructor(form: PersonForm) {
this.form = form
}
update(updateId: string, updatevalue: string) {
this.form.clearAndEnterText(updateId, updateValue)
}
}
现在,我们可以通过先创建“PersonForm”类的实例,再创建并使用“UpdatePerson”类来更新Person的值:
const userForm = new PersonForm()
const updateUser = newUpdatePerson(userForm)
updateUser.update('lastname', 'Smith')
现在,PersonForm类和UpdatePerson类都依赖于接口,而不是低级模块。如果“clearAndEnterText”接口的签名发生了变化,我们需要更新PersonForm类,但是不需要对UpdatePerson类进行更改。
依赖性倒置原则的第二部分指出:“抽象不应该依赖于细节;但细节应该依赖于抽象”。抽象是指的是一个接口或抽象类,它定义了一组行为,但不提供具体的实现。无论是高层模块还是低层模块都应该依赖于抽象,如果它们的实现细节发生了变化,也不应该影响抽象。
换句话说,PersonForm类可以对“clearAndEnterText”函数进行任何更改,但它不会对“AddText”接口产生任何影响。例如,我们可以更改PersonForm类,使它包含一条日志语句,但这不会对“AddText”接口产生任何影响:
class PersonForm implements AddText {
clearAndEnterText(id: string, value: string) {
driver.findElement(By.id(id)).clear().sendKeys(value)
console.log('Element updated')
}
}
以上就是我对SOLID原则的五篇系列文章的总结!在这个过程中我确实学到了很多,我希望这些使用软件测试中常见方法的简单示例对你有所帮助!