.NET Reflection

Một phần của tài liệu Nghiên cứu kỹ thuật kiểm thử phần mềm và ứng dụng trên môi trường DOT NET (Trang 59)

Trong các phần trên bạn đã biết đƣợc cách sử dụng không gian tên Reflection .NET để có đƣợc thông tin từ một assembly. Một assembly có thể có nhiều không gian tên. Một không gian tên có thể chứa nhiều class. Microsoft Visual Studio .NET IDE đã đƣợc cung cấp một công cụ ILDasm.exe để phân tách một một assembly thành underlying code, type metadata, và assembly manifest. Ta cần một kênh cho các công cụ kiểm thử tự động để phân tích assembly trong design-time. Thay vì thực hiện ILDasm.exe công cụ kiểm thử tự động sử dụng các class đƣợc định nghĩa trong không gian tên System.Reflection để lập trình có đƣợc các thông tin tƣơng tự.

Bảng 3.6: Một số lớp (class) quan trọng trong không gian tên System.Reflection [9]

Assembly Lớp có chứa một số phương thức cho phép tải, nghiên cứu, và thao tác với một assembly.

AssemblyName Lớp cho phép ta khám phá ra nhiều chi tiết đằng sau danh tính của một assembly (thông tin phiên bản, thông tin văn hóa, và vv).

EventInfo Lớp chứa thông tin của một sự kiện nhất định.

FieldInfo Lớp chứa thông tin của một thành phần thông tin nhất định.

MemberInfo Đây là lớp cơ sở trừu tượng xác định hành vi phổ biến cho EventInfo, FieldInfo, MethodInfo, và PropertyInfo.

MethodInfo Lớp chứa thông tin của một phương thức nhất định.

Module Lớp cho phép bạn truy cập vào một module cho trước trong nhiều file assembly.

ParameterInfo Lớp chứa thông tin của một tham số cho trước.

PropertyInfo Lớp chứa thông tin của một thuộc tính cho trước.

Không gian tên System.Reflection đƣợc kết hợp vào công cụ kiểm thử sẽ cho phép công cụ tìm mục tiêu để thử nghiệm, và viết kịch bản kiểm thử dựa vào các đặc tính của mục tiêu. Sau khi thảo luận về các thao tác với không gian tên và phân tích một assembly thời gian chạy (runtime), chúng ta sẽ thảo luận về cách một NET. Client sử dụng các kỹ thuật late-binding (Dynamic Testing Invocation) để triệu gọi (invoke) cho một class và phƣơng thức của nó, đây là một khía cạnh quan trọng của .NET/COM interoperability. Các kỹ thuật này kiểm thử COM cũng sẽ đƣợc thảo luận sau.

Không gian tên System.Reflection giúp cho việc tải một assembly trong runtime và khám phá cùng thể loại thông tin với ILDasm.exe. Sau đó nó gom thành một danh sách tất cả các thể loại (type) đƣợc chứa trong một module xác định, bao gồm các phƣơng thức, các trƣờng dữ liệu, các thuộc tính, dữ liệu enum và các sự kiện đã đƣợc định nghĩa trƣớc. Nó cũng có thể khám phá bằng chƣơng trình hóa một tập các

interface hỗ trợ bởi một lớp đã cho (hoặc một structure), các tham số của một phƣơng thức, cũng nhƣ các chi tiết liên quan (base class, namespace information,…). Có rất nhiều thông tin mà kiểm thử viên phải biết một cách chính xác và chi tiết, và cũng cần quan tâm tới rất nhiều thông tin trƣớc khi bắt đầu một task kiểm thử.

Ở đây ta cần nhắc tới lớp System.Type. Là để gom đƣợc thông tin từ một assembly cho trƣớc, không gian tên System.Reflection thƣờng đƣợc dùng cùng với lớp System.Type. Lớp System.Type chứa một số lƣợng phƣơng thức có thể trích rút thông tin có giá trị về type hiện tại bạn đang kiểm thử. Không gian tên System.Reflection cũng chứa một số lƣợng type để thuận tiện cho late-binding và nạp động của các assembly.

Bảng 3.7: Truy vấn thể loại System.Reflection.Assembly theo tên [9]

using System; namespace QueryByName { class TypeName { [STAThread]

static void Main(string[] args) {

Type t = Type.GetType("System.Reflection.Assembly"); Console.WriteLine("Name : {0}",t.Name);

Console.WriteLine("Underlying System Type : {0}",t.UnderlyingSystemType);

Console.WriteLine("Is Class : {0}",t.IsClass); }

} }

Bảng 3.8: Truy vấn thông tin thể loại theo thể hiện của đối tượng [9]

using System; namespace QueryByInstance { class TypeInstance { [STAThread]

static void Main(string[] args) {

string myVar = "Retrieving types by instance"; Type t = myVar.GetType();

Console.WriteLine("Name : {0}",t.Name);

Console.WriteLine("Underlying System Type : {0}",t.UnderlyingSystemType); Console.WriteLine("Is Class : {0}",t.IsClass);

} } }

Bảng 3.9: Xác định thông tin thể loại của một tiến trình đang chạy [9]

using System; (adsbygoogle = window.adsbygoogle || []).push({});

using System.Reflection;

using System.Diagnostics;

class AssemblyType {

public static void Main(string[] args) {

Process p = Process.GetCurrentProcess();

string assemblyName = p.ProcessName + ".exe"; Console.WriteLine("Examining : {0}", assemblyName); Assembly a = Assembly.LoadFrom(assemblyName); Type[] types = a.GetTypes();

foreach(Type t in types) {

Console.WriteLine("\nType : {0}", t.FullName);

Console.WriteLine("Base class : {0}",t.BaseType.FullName); }

} }

Một phần của tài liệu Nghiên cứu kỹ thuật kiểm thử phần mềm và ứng dụng trên môi trường DOT NET (Trang 59)