在本指南中,我们将研究如何在Angular 5项目中编写自动化测试。 Angular Testing是每个使用Angular CLI或Angular快速启动项目设置的项目中可用的核心功能。

Angular测试的主题非常广泛,因为它是一个复杂且非常复杂的主题。 要完全覆盖它,将需要几章或一门全长课程。 因此,在本指南中,我将向您介绍入门的基础知识。

先决条件

在撰写本文时,Angular 5.2是当前的稳定版本-这就是我们将在此处使用的版本。 本指南假定您至少对Angular 4+基础有扎实的了解。 还假设您至少了解该概念或具有一些编写自动化测试的技能。

我们将基于Angular的官方初学者教程建立测试示例,以演示如何编写组件和服务的测试。 您可以在我们的GitHub存储库上找到带有测试的完整代码。 在本指南的最后,您应该具备在Angular 5中实施多个通过测试的技能。

角度测试:通过测试

角度测试技术

如您所知,Angular项目由模板,组件,服务和模块组成。 它们都在称为Angular的环境中运行。 尽管可以编写隔离的测试,但您实际上并不知道您的代码将如何与Angular环境中的其他元素进行交互。

幸运的是,我们有几种技术可以帮助我们以最少的精力编写此类单元测试。

1.角度测试实用程序

这是为Angular代码构建测试环境所需的一组类和函数。 您可以在Angular的api文档中找到它们。 最重要的是TestBed 。 它用于配置Angular模块的方式与@NgModule相同,只是它准备了要测试的模块。 它具有configureTestingModule函数,您可以在其中提供所有必需的依赖关系,以使组件在测试环境中起作用。 这是准备在测试环境中运行的dashboard component的示例。 该组件需要几个依赖项才能运行测试:

TestBed.configureTestingModule({imports: [ RouterTestingModule ],declarations: [ DashboardComponent ],schemas: [ NO_ERRORS_SCHEMA ],providers: [{provide: HeroService,useClass: MockHeroService}],
})
.compileComponents();

我们将在下面更进一步地仔细研究这里发生的事情。

2.茉莉花

Jasmine是编写Angular测试的事实框架。 基本上,这是一个使用行为驱动的表示法的测试框架。 用Jasmine编写测试非常简单:

describe('createCustomer' () => {it('should create new customer',(customer) => {...expect(response).toEqual(newCustomer)});it('should not create customer with missing fields', () => {...expect(response.error.message).toEqual('missing parameters')});it('should not create customer with existing record', () => {...expect(response.error.message).toEqual('record already exists')});
});

茉莉花测试的解剖结构至少由两个元素组成:一个describe函数(它是一组测试)和一个it函数(它是测试本身)。 通常,我们使用describe来表示我们关注的功能,例如createCustomer() 。 然后,在套件中,我们创建多个it测试。 每个测试都将目标函数置于不同的条件下,以确保其行为符合预期。 您可以参考Jasmine文档以获得更多信息。

3.因果报应

Karma是用于在浏览器环境中针对测试代码执行源代码的工具。 它支持在为其配置的每个浏览器中运行测试。 结果显示在命令行和浏览器上,供开发人员检查哪些测试通过或失败。 Karma还会监视文件,并且只要文件发生更改,就可以触发重新运行测试。 在Angular项目的根目录下,我们具有用于配置Karma的文件karma.conf 。 内容应如下所示:

module.exports = function (config) {config.set({basePath: '',frameworks: ['jasmine', '@angular/cli'],plugins: [require('karma-jasmine'),require('karma-chrome-launcher'),require('karma-jasmine-html-reporter'),require('karma-coverage-istanbul-reporter'),require('@angular/cli/plugins/karma')],client:{clearContext: false // leave Jasmine Spec Runner output visible in browser},coverageIstanbulReporter: {reports: [ 'html', 'lcovonly' ],fixWebpackSourcePaths: true},angularCli: {environment: 'dev'},reporters: ['progress', 'kjhtml'],port: 9876,colors: true,logLevel: config.LOG_INFO,autoWatch: true,browsers: ['Chrome'],singleRun: false});
};

请查看Karma的配置文档以了解如何对其进行自定义。 如您所见,Chrome被列为用于运行测试的浏览器。 您需要定义一个名为CHROME_BIN的环境变量,该变量指向您的Chrome浏览器可执行文件的位置。 如果您使用的是Linux,只需将此行添加到.bashrc文件中:

export CHROME_BIN="/usr/bin/chromium-browser"

为了使Karma运行您的测试,必须确保测试文件以.spec.ts 。 您应该注意,Karma设计为主要运行单元测试。 要运行端到端测试,我们需要另一个工具Protractor,接下来我们将对其进行研究。

4.量角器

量角器是Angular的端到端测试框架。 它在真实的浏览器中运行测试,并像真实的人一样与之交互。 与单元测试不同,在单元测试中,我们测试各个功能,而在这里,我们测试整个逻辑。 量角器能够填写表格,单击按钮,并确认预期的数据和样式显示在HTML文档中。 就像噶,量角器有你的角项目的根,自己的配置文件protractor.conf

const { SpecReporter } = require('jasmine-spec-reporter');exports.config = {allScriptsTimeout: 11000,specs: ['./e2e/**/*.e2e-spec.ts'],capabilities: {'browserName': 'chrome'},directConnect: true,baseUrl: 'http://localhost:4200/',framework: 'jasmine',jasmineNodeOpts: {showColors: true,defaultTimeoutInterval: 30000,print: function() {}},onPrepare() {require('ts-node').register({project: 'e2e/tsconfig.e2e.json'});jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));}
};

您可以在此处找到有关其配置的文档。 与Jasmine / Karma测试不同,量角器测试位于src文件夹之外的e2e文件夹中。 我们稍后将研究编写端到端测试。 现在,让我们开始编写单元测试。

写作单元测试

如前所述,Angular附带了为项目编写自动化测试所需的一切。 要开始测试,只需运行以下命令:

ng test

业力将加速运行所有可用的测试。 假设您刚刚完成了“英雄之旅”教程,那么您应该有一个类似的报告:

角度测试:测试失败

当您使用Angular CLI工具生成组件,服务和类时,将创建这些测试。 在创建时,这些测试中的代码是正确的。 但是,当您向组件和服务中添加代码时,测试就失败了。 在下一节中,我们将看到如何解决损坏的测试。

测试组件

对组件进行单元测试可以通过两种方式进行。 您可以单独对其进行测试,也可以在Angular环境中对其进行测试,以查看其如何与其模板和依赖项进行交互。 后者听起来很难实现,但是使用Angular Testing Utilities使创建测试更加容易。 这是使用Angular CLI工具创建组件时为您生成的测试代码的示例:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';import { HeroesComponent } from './heroes.component';describe('HeroesComponent', () => {let component: HeroesComponent;let fixture: ComponentFixture<HeroesComponent>;beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ HeroesComponent ]}).compileComponents();}));beforeEach(() => {fixture = TestBed.createComponent(HeroesComponent);component = fixture.componentInstance;fixture.detectChanges();});it('should be created', () => {expect(component).toBeTruthy();});
});

在第一个beforeEach()函数中,我们使用TestBed.configureTestingModule函数创建用于测试组件的模块环境。 它类似于NgModules ,除了在这种情况下,我们正在创建一个用于测试的模块。
在第二个beforeEach()函数中,我们创建了component-under-test的实例。 完成此操作后,我们将无法再次配置TestBed ,因为将引发错误。

最后,我们有了should be created的规范,我们should be created其中确认component已初始化。 如果此测试通过,则表示组件应在Angular环境中正常运行。 但是,如果失败,则可能是组件具有我们未包含在测试配置中的特定依赖性。 让我们看看如何处理不同的问题。

测试使用另一个组件的组件

在Angular中构建用户界面时,我们经常通过选择器引用模板文件中的其他组件。 看一下以下示例dashboard.component.html

<h3>Top Heroes</h3>
...
</div><app-hero-search></app-hero-search>

在此示例中,我们引用另一个具有选择器app-hero-search 。 如果尝试按原样运行初始测试,它将失败。 这是因为我们尚未在测试环境中声明引用的组件。 在单元测试中,我们将所有精力都放在要测试的组件上。 我们在单元测试中不关心其他组件。 我们必须假设它们正在按预期工作。 在我们的测试中包括引用的组件可能会污染结果。 为了解决此问题,我们可以模拟引用的组件,也可以使用NO_ERRORS_SCHEMA指令将其忽略。 这是一个例子:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';import { DashboardComponent } from './dashboard.component';describe('DashboardComponent', () => {let component: DashboardComponent;let fixture: ComponentFixture<DashboardComponent>;beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ DashboardComponent ],schemas: [ NO_ERRORS_SCHEMA}).compileComponents();}));beforeEach(() => {fixture = TestBed.createComponent(DashboardComponent);component = fixture.componentInstance;fixture.detectChanges();});it('should be created', () => {expect(component).toBeTruthy();});
});

现在,此测试应该不会出现组件依赖性问题。 但是,此测试尚未通过,因为还有另一种情况我们必须处理……

测试使用模块的组件

这次让我们检查一下hero-detail.component.html

<div *ngIf="hero"><h2>{{ hero.name | uppercase }} Details</h2><div><span>id: </span>{{hero.id}}</div><div><label>name:<input [(ngModel)]="hero.name" placeholder="name"/></label></div><button (click)="goBack()">go back</button><button (click)="save()">save</button>
</div>

在这里,我们使用的是ngModel指令,该指令来自FormsModule库。 为了编写支持此模块的测试,我们只需要导入FormsModule并将其包含在TestBed配置中:

import { FormsModule } from '@angular/forms';
...beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ HeroDetailComponent ],imports: [ FormsModule],}).compileComponents();}));...

那应该可以解决FormsModule的问题。 但是,我们需要在测试环境中指定更多依赖关系。

测试使用路由模块的组件

让我们研究一下hero-detail.component.ts构造函数:

constructor(private route: ActivatedRoute,private location: Location,private heroService: HeroService   
) {}

该组件具有处理路由的ActivatedRouteLocation依赖性。 在我们的测试代码hero-detail.component.spec.ts ,我们可以实现类的模拟版本。 但是,我发现最好的解决方案是这样导入RouterTestingModule

import { RouterTestingModule } from ’@angular/router/testing’;
...
beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ HeroDetailComponent ],imports: [ FormsModule, RouterTestingModule ],}).compileComponents();
}));

RoutingTestingModule可以轻松解决我们测试代码中的ActivateRouteLocation依赖关系。 RoutingTestingModule还可以处理涉及路由的其他情况。 在dashboard.component.html查看以下代码:

<h3>Top Heroes</h3>
<div class="grid grid-pad"><a *ngFor="let hero of heroes" class="col-1-4" routerLink="/detail/{{hero.id}}"><div class="module hero"><h4>{{hero.name}}</h4></div></a>
</div>

注意,我们有一个名为routerLink的指令。 这是AppRoutingModule库提供的指令。 如果运行仪表板测试,则由于该依赖关系而将失败。 要解决此问题,只需在dashboard.component.spec.ts实现RoutingTestingModule ,就像我们对hero-detail.component.spec.ts所做hero-detail.component.spec.ts

现在让我们看一下如何测试依赖于服务的组件。

测试使用服务的组件

每个组件至少需要一个服务来处理逻辑。 有两种测试使用服务的组件的方法。 让我们看一下message.service.ts ,它正在由message.component.ts

import { Injectable } from ’@angular/core’;@Injectable()
export class MessageService {messages: string[] = [];add(message: string) {this.messages.push(message);}clear() {this.messages = [];}
}

MessageService具有非常简单的实现。 它不使用任何外部依赖项。 虽然建议从单元测试中排除外部逻辑,但是我们将在这里做一个例外。 我认为不需要使测试复杂化。 因此,我认为最好在测试中包含该服务。 这是message.component.spec.ts的测试代码:

import { MessageService } from '@services/message.service';
...beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ MessagesComponent ],providers: [ MessageService ]}).compileComponents();
}))

现在让我们看看另一个服务hero-service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { catchError, map, tap } from 'rxjs/operators';
...
@Injectable()
export class HeroService {private heroesUrl = 'api/heroes';constructor(private http: HttpClient,private messageService: MessageService) { }/** GET heroes from the server */getHeroes (): Observable<Hero[]> {return this.http.get<Hero[]>(this.heroesUrl).pipe(tap(heroes => this.log(`fetched ${heroes.length} heroes`)),catchError(this.handleError('getHeroes', [])));}getHero(id: number): Observable<Hero> {const url = `${this.heroesUrl}/${id}`;return this.http.get<Hero>(url).pipe(tap(_ => this.log(`fetched hero id=${id}`)),catchError(this.handleError<Hero>(`getHero id=${id}`)));}...
}

HeroService类包含很多逻辑-总共约104行。 它具有多种依赖性,包括一个到另一个服务。 而且,其所有功能都是异步的。 这样复杂的代码很可能会污染我们的单元测试。 因此,我们应排除其逻辑。 我们通过创建模拟版本的hero.service.ts做到这hero.service.ts 。 只需创建一个新文件,并将其hero.service.mock.ts 。 模拟其功能,以剥离其核心逻辑:

import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { Hero } from '@models/hero.model';export class MockHeroService {getHeroes(): Observable<Hero[]> {return of([]);}getHero() {return of({});}
}

您可以看到模拟版本更简单。 现在,它污染我们的单元测试的可能性为零。 要将其包含在我们的组件规格文件中,我们可以这样实现:

import { HeroService } from '@services/hero.service';
import { MockHeroService } from '@services/hero.service.mock';
...TestBed.configureTestingModule({declarations: [ HeroDetailComponent ],imports: [ FormsModule, RouterTestingModule ],providers: [{provide: HeroService,useClass: MockHeroService},],}).compileComponents();}));
...

我们使用providers选项将MockHeroService注入我们的服务。 使用该服务为所有组件的测试代码实现此功能。

测试服务

现在,我们已经处理了测试组件时发生的一些常见情况,下面让我们看一下如何测试服务。 服务执行应用程序的核心逻辑,因此,全面测试其功能非常重要。 如前所述,Angular测试是一个很深的主题,因此我们只是在这里进行介绍。

打开hero.service.ts并检查功能。 让我重点介绍几个:

.../** GET heroes from the server */getHeroes (): Observable<Hero[]> {return this.http.get<Hero[]>(this.heroesUrl).pipe(tap(heroes => this.log(`fetched ${heroes.length} heroes`)),catchError(this.handleError('getHeroes', [])));}/** UPDATE: update selected hero on the server */updateHero (hero: Hero): Observable<any> {return this.http.put(this.heroesUrl, hero, httpOptions).pipe(tap(_ => this.log(`updated hero id=${hero.id}`)),catchError(this.handleError<any>('updateHero')));}
...

每个函数由几行代码组成,但仍在继续。 为了全面测试每种情况,我们需要考虑多种情​​况。 当我们执行getHeroes() ,服务器可能

  • 发回英雄名单
  • 发回一个空清单
  • 抛出错误
  • 无法回应。

您也许可以考虑将更多可能的方案添加到列表中。 现在我们已经考虑了可能的场景,是时候编写测试了。 这是一个如何为HeroService编写specHeroService

import { TestBed, inject } from '@angular/core/testing';
import { HttpClientModule, HttpClient, HttpResponse } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';import { HeroService } from './hero.service';
import { MessageService } from './message.service';
import { Hero } from '@models/hero.model';const mockData = [{ id: 1, name: 'Hulk' },{ id: 2, name: 'Thor'},{ id: 3, name: 'Iron Man'}
] as Hero[];describe('HeroService', () => {let service;let httpTestingController: HttpTestingController;beforeEach(() => {TestBed.configureTestingModule({imports: [HttpClientTestingModule],providers: [HeroService, MessageService]});httpTestingController = TestBed.get(HttpTestingController);});beforeEach(inject([HeroService], s => {service = s;}));beforeEach(() => {this.mockHeroes = [...mockData];this.mockHero = this.mockHeroes[0];this.mockId = this.mockHero.id;});const apiUrl = (id: number) => {return `${service.heroesUrl}/${this.mockId}`;};afterEach(() => {// After every test, assert that there are no more pending requests.httpTestingController.verify();});it('should be created', () => {expect(service).toBeTruthy();});describe('getHeroes', () => {it('should return mock heroes', () => {service.getHeroes().subscribe(heroes => expect(heroes.length).toEqual(this.mockHeroes.length),fail);// Receive GET requestconst req = httpTestingController.expectOne(service.heroesUrl);expect(req.request.method).toEqual('GET');// Respond with the mock heroesreq.flush(this.mockHeroes);});});describe('updateHero', () => {it('should update hero', () => {service.updateHero(this.mockHero).subscribe(response => expect(response).toEqual(this.mockHero),fail);// Receive PUT requestconst req = httpTestingController.expectOne(service.heroesUrl);expect(req.request.method).toEqual('PUT');// Respond with the updated heroreq.flush(this.mockHero);});});describe('deleteHero', () => {it('should delete hero using id', () => {const mockUrl = apiUrl(this.mockId);service.deleteHero(this.mockId).subscribe(response => expect(response).toEqual(this.mockId),fail);// Receive DELETE requestconst req = httpTestingController.expectOne(mockUrl);expect(req.request.method).toEqual('DELETE');// Respond with the updated heroreq.flush(this.mockId);});it('should delete hero using hero object', () => {const mockUrl = apiUrl(this.mockHero.id);service.deleteHero(this.mockHero).subscribe(response => expect(response).toEqual(this.mockHero.id),fail);// Receive DELETE requestconst req = httpTestingController.expectOne(mockUrl);expect(req.request.method).toEqual('DELETE');// Respond with the updated heroreq.flush(this.mockHero.id);});});
});

这只是我们应该如何为与HttpClientModule交互的服务编写测试的示例。 检查每个测试,并注意我们正在使用HttpTestingController类来拦截请求。 在此测试中,我们将控制输入和输出以创建不同的场景。 这些测试的主要目的是确保我们的服务方法能够妥善处理每种情况。 请注意,我们尚未完全实现hero.service.spec.ts所需的所有测试,因为这超出了本指南的范围。

在本指南结束之前,还有更多主题需要我们研究。

端到端角度测试

单元测试可确保组件和服务在受控的测试环境中正确运行。 但是,不能保证组件和服务将在Angular环境中相互交互。 这就是为什么我们需要执行端到端测试。 端到端测试是一种模拟人工测试的测试。 换句话说,这些测试旨在通过​​浏览器界面以与我们相同的方式与我们的应用程序进行交互。

在我们的英雄之旅应用程序中,我们可以测试一些用例,例如确保-

  • 仪表盘组件上显示五个英雄
  • 所有英雄均显示在英雄组件上
  • 导航链接没有损坏
  • 可以创建一个新英雄
  • 英雄可以更新
  • 英雄可以删除。

随着更多功能的实现,您可以继续添加到此列表中。 理想的端到端测试包含两个部分。

第一部分是一个帮助程序文件,提供了特定于组件的帮助程序功能。 这是app.po.ts的示例:

import { browser, by, element } from 'protractor';export class AppPage {navigateTo() {return browser.get('/');}getParagraphText() {return element(by.css('app-root h1')).getText();}
}

定义了辅助功能后,您可以在编写e2e测试时轻松访问它们。 这是e2e/app.e2e.spec.ts的示例:

import { AppPage } from './app.po';describe('angular-tour-of-heroes App', () => {let page: AppPage;beforeEach(() => {page = new AppPage();});it('should display welcome message', () => {page.navigateTo();expect(page.getParagraphText()).toEqual('Welcome to app!');});
});

要运行此测试,只需执行以下命令:

ng e2e

如果这是您第一次执行此命令,则可能需要Internet连接。 测试完成后,您很可能会收到一条类似以下内容的失败消息:

angular-tour-of-heroes App✗ should display welcome message- Expected 'Tour of Heroes' to equal 'Welcome to app!'.

让我们按照以下方法修复错误。 我还添加了一个测试,以确保我们在app-routing.module.ts指定的重定向有效:

import { AppPage } from './app.po';
import { browser  } from 'protractor';describe('angular-tour-of-heroes App', () => {let page: AppPage;beforeEach(() => {page = new AppPage();});it('should redirect to dashboard', async () => {page.navigateTo();const url = await browser.getCurrentUrl();expect(url).toContain('/dashboard');});it('should display welcome message', () => {page.navigateTo();expect(page.getParagraphText()).toEqual('Tour of Heroes');});
});

再次运行测试。 现在,我们应该通过测试:

angular-tour-of-heroes App✓ should redirect to dashboard✓ should display welcome message

观看e2e测试运行真是一种感觉。 它使您确信应用程序将在生产中平稳运行。 既然您已经了解了e2e ,现在该该继续进行另一个出色的测试功能了。

代码覆盖率

作为开发人员,我们最大的问题之一是“我们测试了足够的代码吗?” 幸运的是,我们拥有可以生成“代码覆盖率”的工具,可以确定测试了多少代码。 要生成报告,只需运行以下命令:

ng test --watch=false --code-coverage

Coverage文件夹将在Angular项目的根目录下创建。 浏览该文件夹,您将找到index.html 。 使用网络浏览器打开它。 您应该会看到以下内容:

角度测试:代码覆盖率报告

我不会在这里详细介绍,但是您可以看到有些类已经过完全测试,而另一些还没有完全测试过。 由于时间和资源的可用性,通常并非总是可能实现100%的测试覆盖率。 但是,您可以与您的团队决定最小的数量。 要指定最小值,请使用karma.conf来配置代码覆盖率设置,如下所示:

coverageIstanbulReporter: {reports: [ 'html', 'lcovonly' ],fixWebpackSourcePaths: true,thresholds: {statements: 80,lines: 80,branches: 80,functions: 80}
}

上面的阈值指定了至少80%的单元测试范围。

其他实用程序

现在,我们已经介绍了Angular测试的基础知识。 但是,我们可以通过进一步执行一些步骤来提高代码质量。

1.棉绒

Angular附带了用于执行代码整理的工具。 只需执行以下代码即可对您的项目进行检查:

ng lint

此命令将发出有关代码的警告-例如,在您忘记使用分号或使用太多空格的地方。 该命令还将帮助您识别未使用的代码和语句中的某些错误。 通常使用此命令将确保团队中的每个人都使用一致的样式编写代码。 您可以在tslint.json文件中进一步自定义lint选项。

2.智能代码编辑器

对于代码编辑器和IDE,我个人最喜欢的是Atom和Sublime Text 。 但是,我最近发现了Visual Studio Code ,它具有更吸引人的功能。 它是一个免费的代码编辑器,可以在Windows,macOS和Linux中运行。 它从Atom那里借鉴了很多东西,除了它还具有我要强调的其他功能:

  • 智能感知
  • 突出显示错误
  • 现代角度扩展

当前,在VSCode中内置了Atom和Sublime Text都没有这些功能。 您只需要安装所需的语言扩展名。 键入代码时,Intellisense功能会为您列出选项。 就像自动完成一样,但是具有语法正确选项的特定列表。 使用此功能,很难犯语法错误。 您还可以查看函数的文档,以查看返回类型和所需的输入。

角度测试:Visual Studio代码

Visual Studio Code还具有适当的错误突出显示功能。 它不仅检查语法错误,而且确保分配具有正确的类型。 例如,如果您尝试将数组分配给Observable函数的结果,则会为您突出显示错误。 VSCode还具有与Angular 5兼容的Angular扩展。

拥有一个IDE可以在您键入时检查代码是否存在错误,这对于提高生产力非常有用。 它可以帮助您减少花费在纠正错误上的时间。 可能还有其他代码编辑器可以完成相同的任务,但是目前,我建议为Angular项目使用Visual Studio Code。

3.持续整合

持续集成(CI)是自动化测试和构建的过程。 作为开发人员,我们经常孤立地工作几个星期或更长时间。 当我们将更改合并到master分支时,会产生许多错误和冲突。 这可能需要很多时间才能解决。

CI鼓励开发人员编写测试并经常以较小的位数提交任务。 CI服务器将自动构建并运行测试,以帮助开发人员及早发现错误,从而减少冲突和问题。 Angular开发人员可以使用许多CI解决方案。 查看SitePoint的有关在Travis上测试Jasmine和Karma的教程。

包起来

我们可以访问有关自动化测试的大量信息,以及用于测试驱动的开发的框架,这些信息可以帮助我们编写测试。 但是,有两个原因导致我们不总是编写测试:

  1. 不要为新应用编写测试。 该项目的范围将迅速变化,这取决于客户的需求或市场的反应。
  2. 编写测试除了实现功能外还需要更多时间。 当功能范围更改时,还需要时间来维护。 如果您的预算很低,可以跳过编写测试。 对您拥有的资源要切实可行。

因此,剩下的问题是什么时候该编写测试。 这里有一些指针:

  1. 您已经完成了原型阶段,并确定了应用程序的核心功能。
  2. 您的项目有足够的资金。

现在,假设您已决定强制执行TDD,则有很多好处可以收获:

  1. 编写可以测试的代码意味着您正在编写质量更高的代码。
  2. 作为开发人员,您将更有信心将最新版本发布到生产环境中。
  3. 编写测试是记录代码的一种方式。 这意味着未来的开发人员将可以更轻松地升级遗留代码。
  4. 您无需雇用人员进行质量控制,因为CI服务器将为您完成这项工作。

如果您决定完全跳过产品就绪应用程序的测试,请准备在将来面对生气和失望的客户。 错误的数量将随着代码库大小的增加而呈指数增长。

希望这对Angular测试是一个有用的介绍。 如果您想了解更多信息,建议您首先使用Angular 5官方文档。 除非另有说明,否则大多数信息都针对较旧的Angular版本。

让我们知道您在Angular测试中有任何有趣的提示!

From: https://www.sitepoint.com/angular-testing-introduction/

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. TypeScript相关知识点归纳

    前言 TypeScript 是 JavaScript 的一个超集&#xff0c;主要提供了类型系统和对 ES6 的支持&#xff0c;它由 Microsoft 开发&#xff0c;代码开源于 GitHub 上。 第一个版本发布于 2012 年 10 月&#xff0c;经历了多次更新后&#xff0c;现在已成为前端社区中不可忽视的力量…...

    2024/4/21 15:13:10
  2. TypeScript及TypeScript在vue3.0项目中的基本使用

    一、 TypeScript是什么 TypeScript 是一种由微软开发的自由开源的编程语言&#xff0c;主要提供了类型系统和对 ES6的支持。它是JavaScript的一个超集&#xff0c;扩展了JavaScript的 语法&#xff0c;因此现有的 JavaScript 代码可与TypeScript 一起工作无需任何修改。 TypeS…...

    2024/4/21 15:13:08
  3. Visual Studio代码:高级用户指南

    In this guide, you’ll learn how to take advantage of Visual Studio Code to supercharge your development workflow. 在本指南中&#xff0c;您将学习如何利用Visual Studio Code来增强开发工作流。 This article is written for Visual Studio Code beginners, and use…...

    2024/4/21 15:13:07
  4. 2020-08-25

    实习指导&#xff1a;李春雨 1) Java开发 2) WebUI开发 2. 实习目的&#xff1a;全国疫情可视化平台 3. 当前开发架构 合格软件工程师基本素质 1. 熟悉linux操作系统 2. 能够使用终端的绝对不使用图形化界面&#xff0c;能使用英文界面绝对不汉化 1) 前端工程师…...

    2024/4/21 15:13:06
  5. 杰普实习日志 第一天学习内容

    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

    2024/4/21 15:13:07
  6. 8月27日学习日志

    css基础 选择器 类选择器 .first {} 选中class为first的元素 id选择器 #one {} 选中id为one的元素 标签选择器 div {} 选中所有的div元素 父子选择器 .first > div {} 选中class为first的所有div孩子元素 后代选择器 .first div{} 选中class为first的所有div后代元素 基础布…...

    2024/4/21 15:13:06
  7. 杰普实训日志第一天学习内容

    杰普实习日志 第一天学习内容 主讲人&#xff1a;李春雨 主讲人原创内容&#xff0c;https://gitee.com/plusyu/shixun_hdjd/commit/7fd126f6bacfec6b27357a22bfad4afb1a2ad4b3 1 主要学习内容&#xff1a; 2 1) Java开发 3 2) WebUI开发 4 5 2. 全国疫情可视化平台 6 7 3. …...

    2024/4/21 15:13:03
  8. 实训上课内容1

    实训第一天上课内容汇总 概述 Java开发WebUI开发 全国疫情可视化平台 当前开发架构 合格软件工程师基本素质 熟悉linux操作系统能够使用终端的绝对不使用图形化界面&#xff0c;能使用英文界面绝对不汉化 前端工程师 1. 重构技能&#xff1a;html/css/js 2. 交互技能&…...

    2024/4/20 15:03:12
  9. day1 笔记

    day1笔记 李 Java开发WebUI开发 全国疫情可视化平台 当前开发架构 合格软件工程师基本素质 熟悉linux操作系统能够使用终端的绝对不使用图形化界面&#xff0c;能使用英文界面绝对不汉化 前端工程师 1. 重构技能&#xff1a;html/css/js 2. 交互技能&#xff1a;ajax 3. …...

    2024/4/20 15:03:11
  10. 8.25日学习日志

    Java开发WebUI开发 全国疫情可视化平台 当前开发架构 合格软件工程师基本素质 熟悉linux操作系统能够使用终端的绝对不使用图形化界面&#xff0c;能使用英文界面绝对不汉化 前端工程师 1. 重构技能&#xff1a;html/css/js 2. 交互技能&#xff1a;ajax 3. 企业级框架技能…...

    2024/4/20 15:03:11
  11. 8.25实训内容

    8.25实训内容 1.当前开发架构 合格软件工程师基本素质 1. 熟悉linux操作系统 2. 能够使用终端的绝对不使用图形化界面&#xff0c;能使用英文界面绝对不汉化 前端工程师 1. 重构技能&#xff1a;html/css/js 2. 交互技能&#xff1a;ajax 3. 企业级框架技能&#xff1a;vue…...

    2024/4/20 15:03:09
  12. 华东交通大学18级企业实训day1笔记·讲师:李春雨

    前端工程师 1. 重构技能&#xff1a;html/css/js 2. 交互技能&#xff1a;ajax 3. 企业级框架技能&#xff1a;vue/vuerouter/vuex/elementui | react | angular 4. 移动端技能&#xff1a;webapp、hybirdapp、小程序 5. 通用技能&#xff1a;linux/svn/git/vscodeJava工程师 …...

    2024/4/20 15:03:09
  13. 做双眼皮的疤痕

    ...

    2024/4/20 8:56:46
  14. 开刀双眼皮怎么弄成

    ...

    2024/4/20 15:03:06
  15. 哪里双眼皮医院好心情

    ...

    2024/4/20 15:03:05
  16. 上海开邯郸天姿割割了双眼皮多久能恢复吗

    ...

    2024/4/21 15:13:02
  17. 开双眼皮多少宽合适

    ...

    2024/4/21 15:13:01
  18. SolidWorks 2016 SP5.0 64位 中文版

    万万没想到下载安装的SolidWorks 2018 SP4.0我的老爷机独显4G居然带不动了,略卡绘图还是挺难受的。于是打算装回SolidWorks 2016 SP5.0 结果发现自己引文一心要装18版本把之前的16版删除了,百度云真的是下载慢。但是还是下载下来了,不删了,再删我是Dog。自己留着备份吧!每…...

    2024/4/21 15:13:01
  19. ionic3使用iframe引用外部网站

    1&#xff0c;在configxml文件中添加 <access origin"*" /> <allow-intent href"*" /> <allow-navigation href"*" /> 2.html中加入iframe标签 <ion-content > <iframe id"iframe" sandbox&…...

    2024/4/21 15:12:59
  20. 在开双眼皮哪里好找

    ...

    2024/4/21 15:12:59

最新文章

  1. 汉译英早操练-(十七)

    hello大家好&#xff0c;又到了汉译英早操练“开心一刻”~ 今天来继续学习政府工作报告。 作为权威其重要性可想而知。而且之所以在翻译界一定是权威&#xff0c;主要还是政府工作报告汉语的表述非常的书面化&#xff0c;普通的理解翻译必定非常机械&#xff0c;不够准确&#…...

    2024/4/25 13:33:43
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 鹅厂实习offer

    #转眼已经银四了&#xff0c;你收到offer了吗# 本来都打算四月再投实习了&#xff0c;突然三月初被wxg捞了&#xff08;一年前找日常实习投的简历就更新了下&#xff09;&#xff0c;直接冲了&#xff0c;流程持续二十多天&#xff0c;结果是运气还不错&#xff0c;应该是部门比…...

    2024/4/23 6:25:31
  4. 汽车疲劳测试试验平台技术要求(北重厂家)

    汽车疲劳测试试验平台技术要求通常包括以下几个方面&#xff1a; 车辆加载能力&#xff1a;测试平台需要具备足够的承载能力&#xff0c;能够同时测试多种车型和不同重量的车辆。 动力系统&#xff1a;测试平台需要具备稳定可靠的动力系统&#xff0c;能够提供足够的力和速度来…...

    2024/4/23 6:25:16
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/23 13:30:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/23 13:28:06
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/24 18:16:28
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/23 13:27:44
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/23 13:29:53
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/23 13:27:22
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/23 13:28:42
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/23 22:01:21
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/23 13:29:23
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/24 16:38:05
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/23 13:27:51
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/23 13:27:19
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57