Ferramentas para escrever testes de unidade mais eficientes

Além dos famosos frameworks para testes de unidade, existem muitas outras ferramentas para nos auxiliar a escrever testes com menos código, mais eficientes e muito mais fáceis de manter.

Testes de Unidade

Testes de unidade não são um artefato comum no cenário de desenvolvimento de software corporativo, todos já ouviram falar, alguns tentam colocar em prática mas a questão da falta de design de código acaba não permitindo.

Além disso existem os famosos gestores que inibem a prática, pois acreditam que escrever um código para testar outro código é perda de tempo e aumenta o tempo de projeto.

TDD? Isso é coisa de Jedi! Apenas os desenvolvedores mais graduados na arte da codificação são capazes de escrever o teste de um código que ainda não existe.

Não é bem por ai!

Testes de unidade fazem parte da tarefa de escrever código! Código bom é aquele que pode ser testado. O que vale mais? Rodar a aplicação até o ponto desejado, colocar um break point no código e validar linha a linha se o código está realmente cumprindo a necessidade ou escrever um teste que valide isto?

Além do teste lhe prover um feedback em milissegundos, você só precisa escrever ele uma vez. Rodar a aplicação e realizar o debug pode demorar minutos e este tipo de validação precisa ser repetida dezenas de vezes (ou até mais).

TDD não é a uma técnica complicada, pelo contrário, é simples! Não existem motivos para não testar, na verdade muitos problemas do dia-a-dia seriam evitados com os testes.

Então por que não testamos?

Acredito que o principal fator é que o desenvolvedor não sabe testar! Como eu costumo dizer, isto é uma questão de “tooling”. Tooling seria o ferramental, a prática necessária e ferramentas utilizadas para a escrita de testes de unidade.

Meu objetivo não é provar que testes de unidade vão resolver muitos dos seus problemas e melhorar a qualidade das suas entregas (mas vão sim, acredite).
Meu objetivo é apresentar um ótimo conjunto de ferramentas para que você comece a escrever testes de unidade da melhor forma possível!

Todas as ferramentas são open-source e gratuitas 😉

Frameworks de Testes

São os responsáveis por rodar os testes de unidade e fazer as asserções (Assert) para garantir que o resultado do teste bateu com o esperado.

É a ferramenta mais importante e é necessário fazer uma boa escolha, afinal depois de ter escrito centenas de testes mudar de framework não será simples.

Para .NET não temos tantas opções (ainda bem)

  • MSTest
  • NUnit
  • XUnit

O MSTest é o framework padrão do Visual Studio, desenvolvido pela Microsoft e utilizado em muitos projetos. Eu não costumo utilizar, mas também não o julgo como ruim.

O NUnit é o framework mais utilizado entre desenvolvedores .NET, possui anos de história e atende muito bem as necessidades, podemos ver o NUnit como uma portabilidade do JUnit do Java para .NET.

XUnit é o mais novo desta lista e atualmente meu preferido. Ele foi criado pelos mesmos desenvolvedores do NUnit. A ideia do XUnit surgiu em simplificar e modernizar a forma de escrever testes. Estas mudanças seriam impossíveis de serem aplicadas no NUnit, pois resultaria num gigantesco breaking change nos testes já existentes.

Mas esse XUnit é confiável mesmo? Os desenvolvedores do novo stack do .NET estão utilizando o XUnit. Sim o nosso .NET Core, ASP.NET Core, EF Core, etc estão sendo testados com XUnit. Acho que somente este fato já nos trás bastante segurança certo?

Um pouco mais sobre o XUnit

Escrever testes com o XUnit é um pouco diferente, afinal algumas coisas fogem do padrão, não é necessário fazer Setup, Tear Down etc, basta usar o construtor da clase e o dispose. É um framework muito flexível e é possível criar extensões para diversas finalidades.

Eu sugiro que você leia a comparação feita entre o XUnit e os outros frameworks para começar a ter uma ideia das mudanças. Não deixe também de ler a documentação e visitar o projeto no GitHub.

Para que o Visual Studio reconheça seus testes (uma vez que é o MSTest o padrão) é necessário instalar um “Runner“, existem runners para Visual Studio, Xamarin, Console, MSBuild e etc.

Eu preparei um projeto implementando todas as ferramentas listadas e com exemplos de como utilizar. O link está no final do post (mas continue lendo, tem muito mais).

Frameworks de Mock

O que seriam dos testes sem os Mocks? Para quem não conhece o termo, realizar o Mock de algo é criar em tempo de execução uma instância de uma classe ou a implementação de uma interface. Imagine que seu teste depende de ler algo do banco de dados, você não precisa que ele vá até o banco de fato, basta “fingir” que foi.

O Mock é uma instância de determinado objeto mas nós podemos ensinar este objeto “mockado” a responder conforme nossas necessidades, por exemplo ao invés de ir até o banco simplemente traga uma lista de objetos que já foi definida como retorno. Para isto basta “ensinar” o método do objeto mockado o que ele deve fazer ao ser invocado.

Para Mock também existem algumas opções:

Existem mais opções além dos listados, estes são os mais utilizados atualmente.
O meu preferido e o que utilizo atualmente é o MOQ.

Este MOQ é o melhor? Devo-utilizar?
Não existe o melhor, é questão de afinidade também, mas com certeza o MOQ é um dos melhores e temos mais uma vantagem. A Microsoft utiliza o MOQ junto com o XUnit para desenvolver nosso novo stack do .NET Core.

Um exemplo de Mock com MOQ

Vamos simular que desejamos validar o retorno de um objeto que seria recuperado do banco de dados através de um repositório.

[Fact]
public void CustomerRepository_GetCustomer_ShouldReturnUniqueCustomer()
{
    // Arrange
    var customer = new Customer(Guid.NewGuid(), 
                                "Eduardo Pires");

    var repository = new Mock<ICustomerRepository>();

    repository.Setup(r => r.GetById(customer.Id))
        .Returns(customer);

    // Act
    var customerRet = repository.Object.GetById(customer.Id);

    // Assert
    Assert.Equal(customer, customerRet);
    repository.Verify(r => r.GetById(It.IsAny<Guid>()), 
                           Times.Once);
}

Criamos uma instância do objeto baseado na interface, “ensinamos” ao método o que ele devolveria retornar ao receber determinado parâmetro e pronto.

O MOQ ainda nos oferece o Verify que é um método de Asserção para validarmos se aquele método foi realmente chamado e quantas vezes foi.

Poderíamos ter parado por aqui, pois apenas um bom framework de teste e um de mock já nos bastariam para escrever nossos testes de unidade, mas tem como melhorar bastante esta experiência.

Apresentando o AutoMoq

Imagine que você precisa criar a instância de um objeto mas este objeto recebe diversas dependências injetadas no construtor. Obviamente no teste você não terá um container de DI, nesse caso você precisaria criar um mock de cada dependência e depois passar todas no construtor.

Tranquilo! Mas dá para ser melhor! E se fosse possível criar de uma vez só este objeto com todos os mocks gerados e injetados? Pouparia bastante código né?

É para isto que existe o AutoMoq! Sim você vai querer muito ele em seu projeto.
O AutoMoq gera os mocks do MOQ, está tudo em casa!

A classe CustomerService possui duas dependências injetadas no construtor

public class CustomerService : ICustomerService
{
    private readonly ICustomerRepository _customerRepository;
    private readonly IMediator _mediator;

    public CustomerService(
                ICustomerRepository customerRepository,
                IMediator mediator)
    {
        _customerRepository = customerRepository;
        _mediator = mediator;
    }
}

Vamos criar uma instância dela e automaticamente seus mocks com o AutoMoq

[Fact]
public void CustomerService_RegisterNewCustomer_ShouldRegisterWithSuccess()
{
    // Arrange
    var customer = new Customer(Guid.NewGuid(),
        "Eduardo Pires");

    var mocker = new AutoMoqer();
    mocker.Create<CustomerService>();

    var customerService = mocker.Resolve<CustomerService>();
    var repository = mocker.GetMock<ICustomerRepository>();

    // Act
    customerService.Register(customer);

    // Assert
    repository.Verify(r => r.Add(It.IsAny<Customer>()), 
                           Times.Once);
}

Note de que além de criar o objeto com seus mocks injetados é possível ainda obter estes mocks para que possam ser “ensinados” ou apenas validados como no caso do nosso teste, isso significa que o repositório salvou o cliente, logo podemos entender que o teste conseguiu validar o processo.

O AutoMoq é indispensável para nos poupar da tarefa de criar e injetar cada mock e é basicamente isto que ele faz.

Bogus

Você já deve ter imaginado que é muito chato ter que ficar criando dados de testes (e-mails, telefone, nome, sobrenome, endereço etc). Além disso muitas vezes é necessário simular uma grande lista de dados únicos. Como fazer?

O Bogus é um gerador de dados aleatórios! Existem outros que fazem isto, mas o Bogus é mais humano. Ele gera dados reais e em diversos idiomas \o/

Vamos simular que desejo criar uma lista de 100 clientes

var customerTests = new Faker<Customer>("pt-BR")
    .CustomInstantiator(f => new Customer(
        Guid.NewGuid(),
        f.Name.FirstName(Name.Gender.Male),
        f.Name.LastName(Name.Gender.Male),
        f.Date.Past(80, DateTime.Now.AddYears(-18)),
        f.Internet.Email().ToLower(),
        true,
        DateTime.Now)).Generate(100);

O resultado é muito interessante! Dados humanos gerados com muita facilidade e a garantia de unicidade. Note que não é problema criar um objeto que depende de um construtor.

Bogus Random Data

Uma grande chateação a menos! O Bogus é capaz de gerar diversos tipos de informações e até imagens, recomendo que leia a documentação.

FluentAssertions

É a asserção que garante o resultado do teste, os frameworks tradicionais possuem uma série de métodos para validar se é igual, verdadeiro, falso, maior, menor e etc. Mas a escrita de diversos Asserts pode ser chata e deixar o código inexpressível.

O Fluent Assertions pode te ajudar nisto! Além de utilizar a sintaxe fluente existem inúmeros tipos de asserções que podem ser feitas deixando nosso código mais reduzido e fácil de entender.

[Fact]
public void CustomerService_GetAllActive_ShouldReturnsOnlyActiveCustomers()
{
    // Arrange
    var customerService = Fixture.GetCustomerService();
    Fixture.CustomerRepositoryMock.Setup(c => c.GetAll())
        .Returns(Fixture.GetMixedCustomers());

    // Act
    var customers = customerService.GetAllActive().ToList();

    // Assert Fluent Assertions
    customers.Should().HaveCount(c => c > 1)
        .And.OnlyHaveUniqueItems();

    customers.Should().NotContain(c => !c.Active);
}

É possível mesclar diversas asserções em uma única linha de código.
Bonito né? Não deixe de conferir a documentação.

Outras ferramentas

O meu set básico é este, porém contamos com outras ferramentas como por exemplo o AutoFixture que facilita a criação de objetos comumente utilizados, tudo depende muito das ferramentas que utiliza, o XUnit por exemplo possui um ótimo suporte a Fixture Collections e resolve com elegância esta questão (confira implementação no meu projeto).

Escrever testes é preciso, mas como validar se a cobertura de código está boa?
Ferramentas de Code Coverage servem para validar se o seus testes estão cobrindo bem todo seu código. Não adianta dizer que tem mais de 5.000 testes se estes estão cobrindo apenas 50% do seu código.

Isso significa que metade do seu código corre o risco de ter bugs ou até pior, significa que numa manutenção de rotina você pode mandar um bug para produção por que os testes não estão validando partes da sua aplicação.

O Visual Studio possui uma ótima ferramenta de Code Coverage, mas só está disponível para as versões mais completas. Mas não se preocupe existem boas alternativas.

NCrunch

O NChunch reúne diversas ferramentas para atender nossas necessidades

  • Code coverage
  • Métricas de performance
  • Detalhes das exceptions
  • Execução inteligente dos testes

NDepend

O NDepend possui ferramentas mais avançadas que são muito importantes para quem leva teste de unidade a sério e possui processos de integração contínua, automatização de build e etc.

Ferramentas Gratuitas

Algumas destas features que citei podem ser obtidas separadamente através de outras ferramentas, é questão de buscar e testar!

Uma que eu recomendo é o OpenCover que faz o Code Coverage para qualquer versão do Visual Studio.

Dicas sobre testes

Testar é necessário. Leia, treine, pratique! O “tooling” só desenvolve que bota a mão na massa. Aprenda a testar, aplique esta prática no dia-a-dia e mostre aos seus colegas de trabalho que as vantagens são muito grandes.

Uma ótima sensação é ver um teste falhar após efetuar uma manutenção e pensar:
“Poxa! Eu teria deixado esse bug escapar! Mais um problema evitado!”

Após dominar o processo de escrever bons testes de unidade coloque o TDD em prática e comece a escrever código limpo, desacoplado e testável!

Recomendo dois livros para quem quiser aprender TDD, sugiro ler nesta mesma ordem.

Dica Extra

Evite utilizar o termo “Testes Unitários”, muitas pessoas sentem uma dor forte no ouvido quando mencionado (eu sou uma delas). É um termo errado, utilize sempre “Testes de Unidade”, afinal é isso que é de fato!

Projeto de Exemplo

Agora que você já conhece as ferramentas e para que servem, dê uma conferida no meu projeto de exemplo. É um projeto de domínio simples e outro de testes cobrindo algumas funcionalidades. Fique a vontade para mandar seu Pull Request.


Caso esteja interessado em conhecer mais sobre Testes, TDD, ASP.NET, DDD, Padrões de Arquitetura e boas práticas de desenvolvimento não deixe de conferir as ementas dos meus cursos:

Vamos continuar a troca de experiências, deixe seu comentário abaixo. Se gostou e concorda com o artigo, compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis.

10 Motivos para ir ao DevXperience

O DevXperience é um novo evento de tecnologia para o desenvolvimento de software moderno. Precisa de motivos para ir? Aqui vai 10 deles!

O DevXperience é um novo evento de tecnologia para o desenvolvimento de software moderno.

“Eduardo, como você faz para se atualizar tecnicamente e acompanhar tantas novidades na nossa área?”

Acredito que esta é uma das perguntas que eu mais recebo e minha resposta é sempre a mesma:

“Eu participo de muitos eventos, leio bastante e me envolvo em discussões técnicas.”

1 – Atualização tecnológica

Este é o primeiro motivo! Atualização rápida e fácil!

Participar de eventos é algo que potencializa a nossa capacidade de absorção de novos conhecimentos, afinal um palestrante aborda um tema de dias / horas de pesquisas e experiências profissionais e resume todos os aspectos mais importantes em uma palestra de minutos.

É informação pronta! Não requer horas de pesquisa e ainda conta com a experiência de quem apresenta.

2 – O mundo do desenvolvimento de software mudou

Desenvolver software hoje não é mais como anos atrás! Você está pronto para projetar uma arquitetura baseada em nuvem? Garantir que sua aplicação não caia? Entregar aplicações para diversas plataformas? Garantir a qualidade com processos de testes automatizados?

Você precisa conhecer sobre o desenvolvimento de software moderno! Nossos palestrantes são especialistas no assunto e estão ansiosos para lhe contar.

3 – Seja um desenvolvedor fora da caixinha

Desenvolver software é nossa profissão, mas algumas oportunidades realmente nos desafiam.

Como tornar uma ideia numa Startup? Como pensar na melhor experiência de usuário para uma nova aplicação? Blockchain o que é isto? Bots podem conversar com meu cliente e poupar esforço humano?

Saia da caixa conosco e mergulhe num mundo de novidades impactantes!

4 – Ganhar destaque no trabalho

É inegável! Uma pessoa bem informada possui uma credibilidade muito maior e por consequência recebe mais oportunidades.

Você ser capaz de identificar uma chance de adotar alguma novidade que ficou sabendo através de suas participações em eventos técnicos irá lhe render uma ótima visibilidade.

5 – Injeção de ânimo / realidade

Cansado da rotina do trabalho? Já pensou em largar tudo e vender coco na praia?

As vezes o que precisamos é conhecer novas formas de como inovar em nossa carreira, novos caminhos a seguir, assuntos novos a se especializar. O DevXperience criou uma agenda com diversos temas para impactar de verdade e lhe dar uma injeção de ânimo e também de realidade!

6 – Melhor custo / benefício

Quanto de investimento financeiro seria necessário para aprender sobre todos os assuntos abordados na grade de forma independente? Calcule o valor de sua hora, livros e até cursos que poderiam ser necessários para adquirir o conhecimento desejado.

Investir em eventos é uma ótima opção que com certeza lhe poupará muito tempo e dinheiro.

7 – Aprender a vender

Já encontrou alguma tecnologia que gostou e quis levar para a sua empresa mas na hora faltaram palavras para convencer seu time a utilizar? Acontece!

No DevXperience você será apresentado a uma série de novidades e além disso entenderá por que deve adotá-las, quais as vantagens, como o mercado está reagindo e muito mais.

8 – Networking

Estar em contato com centenas de profissionais em 2 dias de evento é uma ótima oportunidade de ampliar fortemente sua rede de contatos.

Buscando um novo emprego? Procurando a pessoa certa para lançar uma Startup? Gostaria de fazer novas amizades dentro de sua área? O DevXperience receberá 900 participantes de diversos níveis, desenvolvedores, empreendedores, CIO’s, CTO’s e etc.

9 – Palestrantes de grande reconhecimento

Todos os palestrantes são profissionais de grande reconhecimento no mercado e que trabalham no dia-a-dia com as tecnologias que irão apresentar.

Tivemos um grande cuidado em selecionar os palestrantes conforme seu foco técnico para lhe oferecer uma grande experiência de troca de conhecimentos.

10 – Estrutura e local privilegiado

Serão 42 palestras em 3 trilhas simultâneas durante 2 os dias de evento, escolha quais palestras gostaria de assistir, pare para tomar um café e conversar em nosso espaço de networking.

Escolhemos uma estrutura muito bem localizada para facilitar o acesso de todos ao evento. Além da localização também priorizamos o conforto, todas as salas contam com telões de alta qualidade e cadeiras confortáveis planejadas em disposição para que não perca nenhum detalhe.


O que está esperando? Junte se a nós neste grande evento!

Confira nossa agenda, palestrantes e demais detalhes no nosso site:
www.devxperience.com.br

Estarei lá apresentando 2 palestras e espero lhe encontrar também! 🙂

 

AngularJS, Angular 2, 4 e etc – Passando a confusão a limpo

AngularJS 1.x ou Angular 2? Qual utilizar? Vale a pena migrar ou aprender?
O Angular 4 é um novo (novo) Angular? Vamos passar a confusão a limpo!

Angular é o framework SPA mais utilizado do mundo, disto não temos dúvidas.
Escrevo este post para inaugurar minha série sobre Angular e para passar a limpo a grande confusão que este tema gerou com a chegada das novas versões.

Angular

AngularJS vs Angular 2, 4, etc…

It’s just “Angular”

Vamos começar esclarecendo uma das maiores confusões:

  • AngularJS – Primeira versão do Angular (1.x)
  • Angular – (apenas Angular) nova versão do Angular

Quando quiser se referir a versão 1.x chame de AngularJS, para a nova versão chame apenas de Angular. Vejo muitas pessoas ainda chamando de Angular 2 (eu mesmo fazia isto) mas o problema é que o versionamento do Angular está sendo feito de forma diferente e estes números estão mudando bem rápido, afinal já estamos no Angular 4.

Novo Versionamento

Assim como a maioria dos projetos sérios, o time do Angular adotou o versionamento SemVer a partir desta nova versão. É por isto que não existe um Angular 3 😉

SemVer

Para levar a sério o versionamento é necessário trocar o número da versão a cada Breaking Change que surgir, ou seja, se algo for deixar de funcionar ao atualizar para a próxima versão, então esta nova versão deve ganhar um novo Major.

O que explica o salto de 2 para 4 é o pacote @angular/router que já estava na versão 3.3.x enquanto os demais estavam na 2.3.x, logo para termos uma nova versão (utilizando o SemVer de forma séria) foi necessário alinhar todos os pacotes para a versão 4.x.x

O time do Angular planeja soltar 2 major versions a cada ano, então podemos esperar um Angular 6 em 2018. Outro detalhe importante é que será garantida a retrocompatibilidade a cada salto, ou seja, a versão 5 será compatível com a 4, porém com a 6 não é garantido.

Como se prevenir?
Quando houver um break change a classe será marcada como “deprecated” e será mantida na próxima versão, no ciclo seguinte será removida e assim o desenvolvedor ao compilar a aplicação conseguirá identificar as mudanças necessárias para que o código nunca quebre durante as atualizações.

Grandes mudanças

Acredito não ser correto considerar o Angular apenas uma nova versão do AngularJS, pois é basicamente um novo framework com uma nova arquitetura, novo paradigma e praticamente incompatível com a versão 1.x.

Esta incompatibilidade na migração para o novo Angular causou muitas frustrações na comunidade técnica e entre a maioria dos desenvolvedores, inclusive durante um tempo deixou a adoção do Angular numa posição delicada, afinal quem gostaria de escolher um framework que não garante retrocompatibilidade com as versões anteriores?

Após os abalos emocionais as coisas ficaram mais claras, as mudanças foram realmente necessárias! O AngularJS apesar de muito popular e muito amado, possuía muitos problemas entre outros detalhes que desagradavam muitos desenvolvedores (inclusive eu).

Listei algumas grandes mudanças que valem muito serem comentadas:

Component-Based

O Angular é totalmente baseado em componentes. Controllers e o $scope não são mais utilizados e foram substituidos por componentes e diretivas.

Os web-components não são uma novidade, desde 2012 o W3C já possuía um rascunho sobre esta possibilidade. O Angular também não é o único framework que entrega web-components, temos também o Vue.JS, React, Aurelia e etc.

Um componente encapsula uma estrutura (html), estilo (css) e comportamento (javascript) e podem ser utilizados como Tags HTML customizadas. Veja isto como uma grande oportunidade de reaproveitamento de código e padronização de desenvolvimento.

Angular Component

Note que um componente Angular possui uma tag própria (selector) e define o HTML e CSS que utilizará. Como o componente é uma classe é nele que são definidos os comportamentos.

Directives

O Angular fornece uma série de diretivas e também é possível escrever diretivas customizadas.

Angular Directive

Podemos dizer que um componente é uma diretiva que possui template (html, css).

As diretivas manipulam o DOM, possuem um papel muito importante e dão muito poder ao framework. Pretendo dedicar um post inteiro sobre funcionamento e detalhes das diretivas.

TypeScript

Foi possível notar que os códigos de exemplo estão um pouco diferentes?

É possível escrever uma aplicação em Angular utilizando TypeScript. Caso não conheça o TypeScript entenda que trata-se de um superset de JavaScript dando superpoderes a linguagem. O TypeScript foi desenvolvido pela Microsoft (o mesmo criador do C#). Leia meu post sobre esta linguagem.

Eu como desenvolvedor C# adoro o TypeScript, pois a linguagem me permite escrever código JavaScript com muitos conceitos de OOP, muito mais organizado e fácil de entender. É possível utilizar expressões lambda, generics, heranças, interfaces e etc.

No final tudo vira JavaScript de novo!
Quando uma aplicação Angular é compilada ocorre um processo chamado de “Transpile” que transforma o TypeScript para JavaScript, mas não se engane! É possível debugar um código JavaScript olhando para o source original em TypeScript!

Angular Linguagens

É possível utilizar também JavaScript ou Dart para escrever aplicações em Angular, apesar de que existe uma forte preferência ao TypeScript pela grande maioria dos desenvolvedores.

Outros pontos interessantes

Além destes diferenciais apresentados existem muitos outros que eu acho muito relevantes como o mecanismo de injeção de dependência (DI) nativo, o ferramental do Angular CLI, WebPack, Reactive Forms entre outros. Pretendo detalhar cada um deles nos próximos posts desta série.

Um outro detalhe que vale muito a pena ser lembrado é a facilidade de criar aplicações híbridas para Mobile utilizando Angular e Ionic.

Vale a pena migrar para o Angular?

Eu diria que sim! O Angular é um framework completo, possui muitos componentes disponíveis para diversas necessidades e já está pronto! Além disso temos uma certa segurança que é o Google por trás disto tudo.

Migrar ou não migrar pode ser mais uma restrição financeira ou de prazo do que realmente técnica. Certamente um projeto escrito em AngularJS que está em perfeito funcionamento não precisaria ser migrado para o Angular.

Eu tomaria a decisão de migrar quando o projeto tem ainda muito a crescer e no futuro a manutenção se tornará mais vantajosa com o Angular (considere também um bom ganho de performance). A curva de aprendizado é pequena na minha opinião, eu aprendi Angular em 3 dias.

Qual devo aprender primeiro? AngularJS ou Angular?

Depende para qual finalidade deseja aprender!

Se for para atuar no mercado como desenvolvedor, obviamente existem muito mais projetos escritos em AngularJS, sendo assim, seria muito vantajoso dominar o AngularJS e a curva de aprendizado para o Angular seria bem mais tranquila.

Se for para estudos ou futuros projetos com certeza vá de Angular! Não é necessário conhecer AngularJS antes, vá direto para a novidade do momento.

E sobre o React, Vue.JS e etc?

Eu considero o React e Vue.JS bibliotecas, não chegam a ser frameworks. Não que isto seja ruim, mas é diferente! Claro que é possível escrever aplicações maravilhosas com eles, não é este o ponto.

Profissionalmente devido a demanda de mercado eu recomendaria aprender Angular e após adquirir domínio pleno, partir para estudar React, Vue.JS e etc.
É apenas a minha opinião e existem outras que diferem da minha.

Resumindo

Espero ter esclarecido a grande confusão causada pelas versões, novidades e incompatibilidades entre AngularJS e Angular, deixo também algumas referências para enriquecer mais o assunto:

Site oficial do Angular
https://angular.io

Documentação do Angular
https://angular.io/docs


Caso esteja interessado em conhecer mais sobre Angular, ASP.NET, DDD, Padrões de Arquitetura e boas práticas de desenvolvimento não deixe de conferir as ementas dos meus cursos:

Vamos continuar a troca de experiências, deixe seu comentário abaixo. Se gostou e concorda com o artigo, compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis.