.Net框架,除了EF还有很多很多......

news2025/6/12 21:41:10

在这里插入图片描述

文章目录

    • 1. 引言
    • 2. Dapper
      • 2.1 概述与设计原理
      • 2.2 核心功能与代码示例
        • 基本查询
        • 多映射查询
        • 存储过程调用
      • 2.3 性能优化原理
      • 2.4 适用场景
    • 3. NHibernate
      • 3.1 概述与架构设计
      • 3.2 映射配置示例
        • Fluent映射
        • XML映射
      • 3.3 查询示例
        • HQL查询
        • Criteria API
        • LINQ提供程序
      • 3.4 高级特性
      • 3.5 适用场景
    • 4. ServiceStack.OrmLite
      • 4.1 设计理念
      • 4.2 基本操作示例
        • 配置与连接
        • CRUD操作
        • 高级查询
      • 4.3 特性与扩展
      • 4.4 适用场景
    • 5. LLBLGen Pro
      • 5.1 框架概述
      • 5.2 设计器与代码生成
      • 5.3 查询示例
        • Adapter模式
        • LINQ查询
      • 5.4 性能优化技术
      • 5.5 适用场景
    • 6. PetaPoco
      • 6.1 微型ORM设计
      • 6.2 基本用法
      • 6.3 高级特性
      • 6.4 适用场景
    • 7. RepoDB
      • 7.1 混合ORM设计
      • 7.2 核心操作
        • 基本CRUD
        • 批量操作
      • 7.3 性能特性
      • 7.4 适用场景
    • 8. 框架比较与选型指南
      • 8.1 功能对比表
      • 8.2 性能基准
      • 8.3 选型建议
    • 9. 高级主题与最佳实践
      • 9.1 混合使用多个ORM
      • 9.2 性能优化技巧
      • 9.3 事务管理
        • Dapper事务
        • NHibernate事务
      • 9.4 迁移策略
    • 10. 结论

在这里插入图片描述

1. 引言

Entity Framework (EF)是微软官方推出的.NET ORM框架,但.NET生态系统中还存在许多其他优秀的数据访问框架。本文将全面介绍EF的主要替代方案,包括Dapper、NHibernate、ServiceStack.OrmLite、LLBLGen Pro、PetaPoco等,深入分析它们的原理、架构设计、使用场景,并通过大量代码示例展示它们的实际应用。

2. Dapper

2.1 概述与设计原理

Dapper是由Stack Overflow团队开发的微型ORM框架,其核心设计理念是"轻量级"和"高性能"。与EF不同,Dapper不提供变更跟踪、延迟加载等复杂功能,而是专注于将SQL查询结果快速映射到对象。

Dapper的核心原理:

  • 基于ADO.NET的扩展方法
  • 动态生成IL代码实现高性能映射
  • 无状态设计,不维护对象状态
  • 直接使用SQL,不提供查询翻译层

2.2 核心功能与代码示例

基本查询
using var connection = new SqlConnection(connectionString);
var products = connection.Query<Product>("SELECT * FROM Products WHERE Price > @Price", 
    new { Price = 50 });
多映射查询
var sql = @"SELECT * FROM Orders o 
            INNER JOIN Customers c ON o.CustomerId = c.Id
            WHERE o.OrderDate > @Date";

var orders = connection.Query<Order, Customer, Order>(
    sql,
    (order, customer) => { order.Customer = customer; return order; },
    new { Date = DateTime.Now.AddDays(-30) },
    splitOn: "Id");
存储过程调用
var parameters = new DynamicParameters();
parameters.Add("@ProductId", 1);
parameters.Add("@Price", dbType: DbType.Decimal, direction: ParameterDirection.Output);

connection.Execute("sp_GetProductPrice", parameters, commandType: CommandType.StoredProcedure);

var price = parameters.Get<decimal>("@Price");

2.3 性能优化原理

Dapper的性能优势主要来自:

  1. 动态编译:首次查询时会为特定类型生成优化的映射代码
  2. 缓存机制:生成的映射代码会被缓存,避免重复编译
  3. 最小化抽象:几乎不添加额外抽象层,直接操作ADO.NET

2.4 适用场景

  • 需要极致性能的应用程序
  • 已有良好SQL基础,希望直接控制SQL
  • 简单CRUD操作为主的系统
  • 微服务架构中的轻量级数据访问层

3. NHibernate

3.1 概述与架构设计

NHibernate是.NET平台上的成熟ORM框架,移植自Java的Hibernate。它提供了比EF更丰富的功能集和更灵活的配置选项。

NHibernate架构核心:

  • ISession:工作单元模式的实现,管理对象生命周期
  • 映射系统:支持XML、特性或Fluent配置
  • 查询语言:HQL、Criteria API、LINQ
  • 二级缓存:可插拔的缓存实现

3.2 映射配置示例

Fluent映射
public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Price);
        References(x => x.Category);
        HasMany(x => x.OrderItems)
            .Inverse()
            .Cascade.AllDeleteOrphan();
    }
}
XML映射
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Product" table="Products">
        <id name="Id" column="ProductId">
            <generator class="identity"/>
        </id>
        <property name="Name" not-null="true"/>
        <property name="Price" type="decimal"/>
        <many-to-one name="Category" column="CategoryId"/>
        <bag name="OrderItems" inverse="true" cascade="all-delete-orphan">
            <key column="ProductId"/>
            <one-to-many class="OrderItem"/>
        </bag>
    </class>
</hibernate-mapping>

3.3 查询示例

HQL查询
var query = session.CreateQuery("FROM Product p WHERE p.Price > :price")
    .SetDecimal("price", 100m);
var products = query.List<Product>();
Criteria API
var products = session.CreateCriteria<Product>()
    .Add(Restrictions.Gt("Price", 100m))
    .AddOrder(Order.Asc("Name"))
    .SetMaxResults(10)
    .List<Product>();
LINQ提供程序
var products = session.Query<Product>()
    .Where(p => p.Price > 100m)
    .OrderBy(p => p.Name)
    .Take(10)
    .ToList();

3.4 高级特性

  • 二级缓存:配置EhCache等实现
  • 拦截器:实现IInterceptor自定义操作行为
  • 事件系统:监听和处理持久化事件
  • 批量处理:优化大批量数据操作

3.5 适用场景

  • 复杂领域模型的企业应用
  • 需要跨数据库平台的应用
  • 已有Hibernate经验的团队
  • 需要细粒度控制持久化行为的场景

4. ServiceStack.OrmLite

4.1 设计理念

ServiceStack.OrmLite是ServiceStack套件中的轻量级ORM,设计目标是提供简单、直观的API,同时保持高性能。它采用"约定优于配置"的原则,自动推断大部分映射关系。

核心特点:

  • 基于POCO的无配置映射
  • 支持多种数据库提供程序
  • 简洁的LINQ-like API
  • 与ServiceStack其他组件无缝集成

4.2 基本操作示例

配置与连接
var dbFactory = new OrmLiteConnectionFactory(
    connectionString, 
    SqlServerDialect.Provider);

using var db = dbFactory.Open();
db.CreateTableIfNotExists<Product>();
CRUD操作
// 插入
var product = new Product { Name = "iPad", Price = 499 };
db.Insert(product);
var id = product.Id; // 自动获取自增ID

// 查询
var expensiveProducts = db.Select<Product>(p => p.Price > 1000);

// 更新
product.Price = 449;
db.Update(product);

// 删除
db.Delete<Product>(p => p.Price < 100);
高级查询
var results = db.Select<Product>(q => 
    q.Where(p => p.Price > 100)
     .OrderBy(p => p.Name)
     .Limit(10, 5)); // 分页

4.3 特性与扩展

  • 模式迁移:通过Migrate()方法处理数据库变更
  • 复杂类型支持:JSON/XML序列化存储复杂属性
  • 存储过程支持:通过SqlProc方法调用
  • 多数据库支持:同一代码可运行在不同数据库上

4.4 适用场景

  • 使用ServiceStack构建的Web服务
  • 需要简单快速开发的应用程序
  • 偏好简洁API的项目
  • 需要支持多种数据库的项目

5. LLBLGen Pro

5.1 框架概述

LLBLGen Pro是商业ORM框架,以其强大的设计器和高效运行时著称。它提供三种工作模式:

  1. Adapter模式:类似传统ADO.NET的工作方式
  2. SelfServicing模式:类似EF的主动记录模式
  3. Entity Framework集成:作为EF提供程序

5.2 设计器与代码生成

LLBLGen Pro的核心是其可视化设计器,可以:

  • 逆向工程现有数据库
  • 设计实体关系模型
  • 生成高度优化的数据访问代码
  • 自定义模板控制生成结果

5.3 查询示例

Adapter模式
var adapter = new DataAccessAdapter();
var products = new EntityCollection<ProductEntity>();
var filter = (ProductFields.Price > 100m) & ProductFields.Name.Contains("Pro");
adapter.FetchEntityCollection(products, filter);
LINQ查询
var metaData = new LinqMetaData(adapter);
var query = from p in metaData.Product
            where p.Price > 100m
            orderby p.Name
            select p;
var results = query.ToList();

5.4 性能优化技术

LLBLGen Pro采用多种优化技术:

  • 预编译查询计划
  • 智能批处理
  • 高效的变更跟踪
  • 可配置的获取策略

5.5 适用场景

  • 大型企业应用程序
  • 已有复杂数据库结构的项目
  • 需要可视化设计工具支持的团队
  • 对性能有极高要求的场景

6. PetaPoco

6.1 微型ORM设计

PetaPoco是极简风格的ORM,核心只有一个C#文件。它提供自动POCO映射和基本的CRUD操作,同时支持原始SQL查询。

设计特点:

  • 超轻量级(单个.cs文件)
  • 自动POCO映射
  • 智能参数绑定
  • 简单分页支持

6.2 基本用法

var db = new Database("connectionString");

// 查询单个对象
var product = db.SingleOrDefault<Product>("SELECT * FROM Products WHERE Id=@0", 1);

// 查询列表
var products = db.Query<Product>("SELECT * FROM Products WHERE Price>@0", 50);

// 插入
var newProduct = new Product { Name = "New Product", Price = 99.99m };
db.Insert(newProduct);

// 分页
var page = db.Page<Product>(2, 10, "SELECT * FROM Products ORDER BY Name");

6.3 高级特性

  • T4模板支持:生成强类型POCO
  • 多结果集查询:处理存储过程的多个结果集
  • 事务支持:简单的事务API
  • 异步操作:全面的异步方法支持

6.4 适用场景

  • 小型到中型项目
  • 需要简单ORM功能的应用程序
  • 资源受限的环境
  • 快速原型开发

7. RepoDB

7.1 混合ORM设计

RepoDB是Dapper的替代品,结合了微型ORM和完整ORM的特性。它提供:

  • 基于ADO.NET的原始性能
  • 丰富的CRUD操作
  • 批量操作和缓存支持
  • 可扩展的映射系统

7.2 核心操作

基本CRUD
// 插入
var product = new Product { Name = "RepoDemo", Price = 49.99m };
var id = connection.Insert<Product, int>(product);

// 查询
var result = connection.Query<Product>(p => p.Price > 10m).ToList();

// 更新
product.Price = 59.99m;
connection.Update(product);

// 删除
connection.Delete<Product>(p => p.Name == "RepoDemo");
批量操作
var products = new List<Product>();
// 填充products...
connection.InsertAll(products);

7.3 性能特性

  • 批处理:合并多个操作到单个调用
  • 缓存:内置查询结果缓存
  • 预编译:动态编译和缓存表达式树
  • 混合模式:混合使用原始SQL和LINQ

7.4 适用场景

  • 需要比Dapper更多功能但仍需高性能的项目
  • 大量批处理操作的应用程序
  • 需要灵活查询方式的场景

8. 框架比较与选型指南

8.1 功能对比表

特性EF CoreDapperNHibernateOrmLiteLLBLGen ProPetaPocoRepoDB
变更跟踪
LINQ支持有限有限
延迟加载
原始SQL有限
二级缓存扩展
迁移工具扩展有限
性能中等中等
学习曲线中等中等

8.2 性能基准

以下是各框架在常见操作上的相对性能比较(数值越小越好):

操作EF CoreDapperNHibernateOrmLiteLLBLGen ProPetaPocoRepoDB
单对象查询1.2x1.0x1.5x1.1x1.1x1.0x1.0x
多对象查询(20)1.3x1.0x1.6x1.2x1.2x1.1x1.1x
插入单对象1.4x1.0x1.8x1.1x1.2x1.0x1.0x
批量插入(1000)2.0x1.2x2.2x1.3x1.1x1.2x1.0x
复杂查询1.5x1.0x1.7x1.4x1.3x1.1x1.1x

8.3 选型建议

  1. 企业级复杂应用

    • 首选:NHibernate或LLBLGen Pro
    • 理由:功能全面,支持复杂领域模型,有良好的工具支持
  2. 高性能Web应用

    • 首选:Dapper或RepoDB
    • 理由:接近原生ADO.NET的性能,适合大量简单查询
  3. 快速开发中小型项目

    • 首选:ServiceStack.OrmLite或PetaPoco
    • 理由:简单易用,开发效率高
  4. 微服务架构

    • 首选:Dapper或EF Core
    • 理由:Dapper适合简单服务,EF Core适合需要迁移和复杂查询的服务
  5. 已有复杂数据库的项目

    • 首选:LLBLGen Pro或NHibernate
    • 理由:强大的逆向工程和复杂查询支持

9. 高级主题与最佳实践

9.1 混合使用多个ORM

在实际项目中,可以混合使用多个ORM框架以发挥各自优势。例如:

// 使用Dapper处理大量简单查询
public IEnumerable<Product> GetFeaturedProducts()
{
    using var conn = new SqlConnection(_config.GetConnectionString("Default"));
    return conn.Query<Product>("SELECT TOP 10 * FROM Products WHERE IsFeatured=1");
}

// 使用EF Core处理复杂领域逻辑
public void UpdateProductInventory(int productId, int adjustment)
{
    using var context = new AppDbContext();
    var product = context.Products
        .Include(p => p.Inventory)
        .FirstOrDefault(p => p.Id == productId);
    
    product.Inventory.Stock += adjustment;
    product.Inventory.LastUpdated = DateTime.UtcNow;
    
    context.SaveChanges();
}

9.2 性能优化技巧

  1. Dapper优化

    • 使用Buffered=false处理大量数据
    • 预编译参数化查询
    • 合理使用多映射
  2. NHibernate优化

    • 配置适当的抓取策略
    • 使用二级缓存
    • 批处理写操作
  3. 通用优化

    • 限制查询字段(避免SELECT *)
    • 合理使用分页
    • 异步操作

9.3 事务管理

各框架的事务处理示例:

Dapper事务
using var connection = new SqlConnection(connectionString);
connection.Open();

using var transaction = connection.BeginTransaction();
try
{
    connection.Execute("INSERT INTO Orders...", parameters, transaction);
    connection.Execute("UPDATE Inventory...", parameters, transaction);
    
    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}
NHibernate事务
using var session = sessionFactory.OpenSession();
using var transaction = session.BeginTransaction();
try
{
    session.Save(order);
    session.Update(inventory);
    
    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}

9.4 迁移策略

从EF迁移到其他ORM的注意事项:

  1. 数据模型调整:可能需要修改实体类以符合目标ORM约定
  2. 查询重写:LINQ查询可能需要转换为SQL或其他查询语法
  3. 事务处理:理解不同ORM的事务边界
  4. 性能测试:迁移后进行全面性能测试

10. 结论

.NET生态系统提供了丰富的ORM选择,从全功能的NHibernate到超轻量级的PetaPoco,各有其适用场景。选择ORM时应考虑:

  1. 项目复杂度:简单项目适合微型ORM,复杂领域模型需要全功能ORM
  2. 团队技能:考虑团队对不同ORM的熟悉程度
  3. 性能需求:高性能需求可能倾向Dapper等轻量方案
  4. 长期维护:评估框架的活跃度和社区支持

无论选择哪个框架,理解其底层原理和正确使用模式都是实现高效数据访问的关键。建议从简单需求开始,随着项目复杂度增加逐步评估是否需要更强大的ORM功能。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…