text:
Phát triển hướng theo kiểm thử là một thành phần quan trọng của việc phát
triển phần mềm. Nếu mã lệnh không được kiểm thử, thì nó sẽ đổ vỡ. Tất cả
mã lệnh phải được kiểm thử, và điều lý tưởng là các phép kiểm thử phải
được viết trước khi viết mã của mô hình. Nhưng có một số thứ dễ dàng được
kiểm thử hơn những thứ khác. Nếu bạn đang viết một lớp đơn giản để biểu
diễn tiền tệ, thì rất dễ dàng để kiểm thử rằng bạn có thể cộng $ 1.23 với
2.28 € và nhận được kết quả là $ 4.03 và không phải là $ 3.03 hoặc $
4,029999998. Ta cũng không gặp nhiều khó khăn hơn để kiểm thử rằng ta
không thể tạo ra một số tiền là $ 7.465. Nhưng làm thế nào để bạn kiểm thử
phương thức quy đổi $ 7.50 thành 5.88 € - nhất là khi tỷ giá hối đoái được
áp dụng bằng cách kết nối đến một cơ sở dữ liệu sống, với các thông tin
được cập nhật liên tục mỗi giây? Kết quả đúng của phương thức
amount.toEuros() có thể thay đổi mỗi khi bạn chạy chương
trình.
Câu trả lời là các đối tượng giả (mock objects). Thay vì kết nối
với một máy chủ thực cung cấp thông tin về tỷ giá được cập nhật mỗi phút,
phép kiểm thử kết nối tới một máy chủ giả luôn luôn trả về cùng tỷ giá hối
đoái. Thế thì bạn có một kết quả dự đoán trước được mà bạn có thể kiểm
thử. Sau cùng, mục tiêu là kiểm thử lôgic hoạt động trong phương thức
toEuros() chứ không phải kiểm tra máy chủ có gửi đi các giá
trị chính xác hay không. (Hãy để cho các nhà phát triển đã xây dựng máy
chủ lo việc này). Loại đối tượng giả này đôi khi được gọi là đồ giả
(fake).
Các đối tượng giả cũng có thể hữu ích cho việc kiểm thử các điều kiện lỗi.
Ví dụ: Điều gì sẽ xảy ra nếu phương thức
toEuros() cố gắng
lấy ra tỷ giá mới nhất, khi mạng bị hỏng? Bạn có thể tháo cáp mạng
Ethernet khỏi máy tính của mình và sau đó chạy phép kiểm thử của bạn,
nhưng ta sẽ không cần nhiều công sức để viết một đối tượng giả, mô phỏng
một lỗi mạng.
Các đối tượng giả cũng có thể được dùng để do thám hành vi của một lớp. Bằng cách đặt các xác nhận bên trong mã đối tượng giả, bạn có thể xác minh được rằng mã đang được kiểm thử chuyển các đối số đúng đắn cho các đối tượng cộng tác với nó vào đúng thời điểm. Đối tượng giả có thể cho phép bạn xem và kiểm thử các phần riêng tư (private) của một lớp mà không để lộ chúng ra qua các phương thức công cộng không cần thiết khác.
Cuối cùng, các đối tượng giả giúp loại bỏ khỏi phép kiểm thử các phụ thuộc cồng kềnh. Chúng làm cho các phép kiểm thử trở nên một đơn vị trọn vẹn hơn. Thất bại trong phép kiểm thử dùng một đối tượng giả sẽ nhiều khả năng là thất bại trong phương thức đang được kiểm thử hơn là ở trong một phụ thuộc của nó. Điều này giúp cô lập vấn đề và làm cho việc gỡ lỗi trở nên đơn giản hơn.
EasyMock là một thư viện đối tượng giả mã nguồn mở cho ngôn ngữ lập trình Java, giúp bạn nhanh chóng và dễ dàng tạo ra các đối tượng giả cho tất cả các mục đích đó. Nhờ sự kỳ diệu của phép ủy nhiệm (proxy) động, EasyMock cho phép bạn tạo ra một triển khai thực hiện cơ sở của bất kỳ giao diện nào chỉ với một dòng mã lệnh. Bằng cách thêm phần mở rộng về lớp của EasyMock, bạn cũng có thể tạo ra các cái làm giả (mocks) các lớp. Các giả lớp này có thể được cấu hình cho bất kỳ mục đích nào, từ các đối số giả đơn giản để điền vào một chữ ký phương thức đến các trình do thám đa triệu gọi (multi-invocation), nhằm xác minh một dãy dài các cuộc gọi phương thức.
Giới thiệu về EasyMock
Tôi sẽ bắt đầu bằng một ví dụ cụ thể để chứng tỏ EasyMock làm việc như thế
nào. Liệt kê 1 là giao diện
ExchangeRate giả định. Giống như
bất kỳ giao diện nào, nó chỉ đơn giản nói lên những gì mà một cá thể làm
chứ không chỉ rõ cá thể làm điều đó như thế nào. Ví dụ: Nó không nói các
dữ liệu về tỷ giá hối đoái đến từ trang Yahoo finance, từ chính phủ, hay
từ nơi nào khác.
Liệt kê 1. Giao diện
ExchangeRate
import java.io.IOException; public interface ExchangeRate { double getRate(String inputCurrency, String outputCurrency) throws IOException; }
Liệt kê 2 là bộ xương sườn của lớp
Currency (tiền tệ) giả
định. Nó thực sự khá phức tạp, và nó cũng có thể có lỗi. (Tôi tránh cho
bạn khỏi phải hồi hộp: nó có lỗi – thực sự cũng kha khá lỗi)
Liệt kê 2. Lớp
Currency
import java.io.IOException; public class Currency { private String units; private long amount; private int cents; public Currency(double amount, String code) { this.units = code; setAmount(amount); } private void setAmount(double amount) { this.amount = new Double(amount).longValue(); this.cents = (int) ((amount * 100.0) % 100); } public Currency toEuros(ExchangeRate converter) { if ("EUR".equals(units)) return this; else { double input = amount + cents/100.0; double rate; try { rate = converter.getRate(units, "EUR"); double output = input * rate; return new Currency(output, "EUR"); } catch (IOException ex) { return null; } } } public boolean equals(Object o) { if (o instanceof Currency) { Currency other = (Currency) o; return this.units.equals(other.units) && this.amount == other.amount && this.cents == other.cents; } return false; } public String toString() { return amount + "." + Math.abs(cents) + " " + units; } }
Nhìn thoáng qua, có thể chưa thấy rõ ràng ngay một điều quan trọng về thiết
kế của lớp
Currency. Tỷ giá hối đoái được chuyển từ bên ngoài
lớp vào. Nó không được xây dựng ở bên trong lớp. Điều này là rất trọng
yếu, cho phép tôi làm giả tỷ giá hối đoái để các phép kiểm thử có thể chạy
mà không cần nói chuyện với máy chủ tỷ giá hối đoái thực. Nó cũng cho phép
các ứng dụng phía khách cung cấp các nguồn khác nhau của dữ liệu tỷ giá
hối đoái.
Liệt kê 3 trình bày một phép kiểm thử JUnit để xác minh rằng $ 2.50 đã được
quy đổi thành 3.75 € khi tỷ giá hối đoái là 1.5. EasyMock được sử dụng để
tạo ra đối tượng
ExchangeRate luôn cung cấp giá trị 1.5.
Liệt kê 3. Lớp
CurrencyTest
import junit.framework.TestCase; import org.easymock.EasyMock; import java.io.IOException; public class CurrencyTest extends TestCase { public void testToEuros() throws IOException { Currency testObject = new Currency(2.50, "USD"); Currency expected = new Currency(3.75, "EUR"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertEquals(expected, actual); } }
Bạn hãy chạy phép thử này và nó thoát thành công. Điều gì đã xảy ra? Ta hãy nhìn vào từng dòng lệnh một của phép kiểm thử. Trước tiên đối tượng kiểm thử và kết quả dự kiến được xây dựng:
Currency testObject = new Currency(2.50, "USD"); Currency expected = new Currency(3.75, "EUR");
Chưa có gì mới.
Tiếp theo tôi tạo một phiên bản giả của giao diện
ExchangeRate
bằng cách gửi đối tượng
Class cho giao diện này tới cho
phương thức tĩnh
EasyMock.createMock():
ExchangeRate mock = EasyMock.createMock(ExchangeRate.class);
Đây là một phần huyền bí nhất. Hãy lưu ý rằng tôi chưa hề viết một lớp thực
hiện giao diện
ExchangeRate nào. Hơn nữa, tuyệt đối không có
cách nào mà phương thức
EasyMock.createMock() có thể được
được định kiểu để trả về một cá thể
ExchangeRate, một kiểu mà
nó chưa bao giờ biết đến và tôi đã tạo ra chỉ vì bài viết này. Và ngay cả
khi nếu bởi một phép mầu nào đó, nó trả về một
ExchangeRate,
thì điều gì xảy ra khi tôi cần làm giả một cá thể của một giao diện khác?
Lần đầu tiên tôi thấy điều này tôi gần như ngã ngửa người vì ngạc nhiên. Tôi không tin rằng mã này có thể biên dịch được, và nó đã làm được điều đó. Có một ma thuật bí ẩn ở đây, nó là kết quả của sự kết hợp giữa đặc điểm chung của Java 5 với phép ủy nhiệm động đã được đưa vào kể từ Java phiên bản 1.3 (xem phần Tài nguyên). May mắn thay, để sử dụng nó (và thán phục sự thông minh của các lập trình viên đã phát minh ra các thủ thuật này), bạn không cần phải hiểu cách nó hoạt động như thế nào.
Bước tiếp theo thực sự đáng ngạc nhiên. Để báo cho đối tượng giả những gì
mà mình mong đợi, tôi gọi phương thức như một đối số của phương thức
EasyMock.expect(). Sau đó, tôi gọi phương thức
andReturn() để chỉ rõ những gì sẽ là kết quả của việc gọi
phương thức này:
EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5);
EasyMock ghi lại hành động triệu gọi này và nó biết sau này cần làm những gì.
Tiếp theo tôi làm cho đối tượng giả sẵn sàng phát lại dữ liệu đã được ghi
lại của nó bằng cách gọi phương thức
EasyMock.replay():
EasyMock.replay(mock);
Đây là một phần của thiết kế mà tôi nhận thấy có một chút rối rắm. Phương
thức
EasyMock.replay() không thực sự phát lại đối tượng giả.
Thay vào đó, nó thiết đặt lại đối tượng giả để lần sau khi các phương thức
của nó được gọi, nó sẽ bắt đầu việc phát lại.
Bây giờ đối tượng giả đã được chuẩn bị xong, tôi chuyển nó như một đối số tới cho phương thức đang được kiểm thử:
Currency actual = testObject.toEuros(mock);
Cuối cùng, tôi kiểm tra xem câu trả lời có đúng như mong đợi không:
assertEquals(expected, actual);
Và tất cả chỉ có thế. Bất cứ lúc nào bạn có một giao diện cần phải trả những về kết quả nhất định dành cho mục đích của kiểm thử, thì bạn có thể chỉ cần tạo nhanh ra một đối tượng giả. Điều này thực sự dễ dàng. Giao diện ExchangeRate đủ nhỏ và đơn giản để tôi có thể viết thủ công một cách dễ dàng một lớp giả. Tuy nhiên, giao diện càng lớn và càng phức tạp, thì càng mất nhiều công để viết các đối tượng giả riêng lẻ cho mỗi kiểm thử đơn vị. EasyMock cho phép bạn thực hiện các giao diện lớn như java.sql.ResultSet hoặc org.xml.sax.ContentHandler bằng một dòng mã, và sau đó cung cấp cho chúng đủ hành vi để chạy phép kiểm thử của bạn.
Kiểm tra các ngoại lệ
Một trong những sử dụng phổ biến hơn của đối tượng giả là để kiểm thử các điều kiện ngoại lệ. Ví dụ: Bạn không thể dễ dàng tạo ra một vụ hỏng mạng theo yêu cầu của mình, nhưng bạn có thể tạo ra vụ hỏng giả, phỏng theo vụ hỏng thực.
Lớp Currency được giả định là trả về kết quả null khi phương thức getRate() đưa ra một ngoại lệ IOException. Liệt kê 4 kiểm thử điều này:
Liệt kê 4. Kiểm thử xem một phương thức đưa ra ngoại lệ đúng
public void testExchangeRateServerUnavailable() throws IOException { Currency testObject = new Currency(2.50, "USD"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andThrow(new IOException()); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertNull(actual); }
Đoạn mã mới ở đây là phương thức andThrow(). Như bạn có thể đã đoán được, đoạn mã này chỉ ra lệnh cho phương thức getRate () đưa ra một ngoại lệ đã định khi được gọi.
Bạn có thể trả về bất kỳ loại ngoại lệ nào mà bạn thích – ngoại lệ đã kiểm tra (checked), ngoại lệ thời gian chạy (runtime) hoặc lỗi (error) - chừng nào mà chữ ký phương thức còn hỗ trợ nó. Điều này đặc biệt hữu ích để kiểm thử các điều kiện đặc biệt hiếm khi xảy ra (Ví dụ như lỗi tràn bộ nhớ hoặc không tìm thấy định nghĩa lớp) hoặc các điều kiện chỉ ra lỗi máy ảo (ví dụ như có không có mã ký tự UTF-8).
Thiết đặt các kết quả mong đợi
EasyMock không chỉ cung cấp cho câu trả lời làm sẵn cho các câu hỏi được làm sẵn. Nó cũng có thể kiểm tra xem đầu vào có đúng những gì cần phải có hay không. Ta lấy ví dụ, giả sử rằng phương thức toEuros() có lỗi như trong liệt kê 5, tại đây nó sẽ trả về một kết quả tính bằng đồng euro nhưng lại lấy tỷ giá hối đoái cho đồng đô la Canada. Điều này có thể làm ai đó được hoặc bị mất rất nhiều tiền.
Liệt kê 5. Một phương thức toEuros() bị lỗi
public Currency toEuros(ExchangeRate converter) { if ("EUR".equals(units)) return this; else { double input = amount + cents/100.0; double rate; try { rate = converter.getRate(units, "CAD"); double output = input * rate; return new Currency(output, "EUR"); } catch (IOException e) { return null; } } }
Tuy nhiên, tôi không cần phải làm một phép kiểm thử bổ sung cho việc này. Đoạn mã testToEuros trong Liệt kê 4 đã bắt lỗi này rồi. Khi bạn chạy phép thử này với mã bị lỗi trong liệt kê 4, thì phép thử sẽ không thành công với thông báo lỗi sau:
"java.lang.AssertionError: Unexpected method call getRate("USD", "CAD"): getRate("USD", "EUR"): expected: 1, actual: 0".
Lưu ý rằng đây không phải là một khẳng định mà tôi tạo ra. EasyMock nhận thấy rằng các đối số mà tôi đã dùng không ăn nhập và đánh hỏng ca kiểm thử.
Theo mặc định, EasyMock chỉ cho phép các ca kiểm thử gọi những phương thức mà bạn đã định với các đối số mà bạn đã chỉ rõ. Đôi khi đây là một điều hơi quá khắt khe, do đó có những cách để nới lỏng nó. Ví dụ: Giả sử tôi muốn cho phép bất kỳ một chuỗi ký tự nào được chuyển cho phương thức getRate(), thay vì chỉ là USD và EUR. Thế thì tôi có thể chỉ rõ rằng tôi mong đợi phương thức EasyMock.anyObject () thay vì các chuỗi ký tự tường minh, như liệt kê sau:
EasyMock.expect(mock.getRate( (String) EasyMock.anyObject(), (String) EasyMock.anyObject())).andReturn(1.5);
Tôi có thể đào sâu thêm một chút và chỉ rõ phương thức EasyMock.notNull () chỉ cho phép các chuỗi không rỗng:
EasyMock.expect(mock.getRate( (String) EasyMock.notNull(), (String) EasyMock.notNull())).andReturn(1.5);
Việc kiểm tra kiểu tĩnh sẽ ngăn không cho giá trị không phải là chuỗi ký tự được chuyển cho phương thức này. Tuy nhiên, bây giờ tôi cho phép cả các giá trị kiểu String ngoài USD và EUR. Bạn có thể sử dụng các biểu thức chính quy để được thể hiện tường minh hơn với phương thức EasyMock.matches (). Ở đây tôi yêu cầu một chuỗi ký tự ASCII gồm ba ký tự, viết hoa:
EasyMock.expect(mock.getRate( (String) EasyMock.matches("[A-Z][A-Z][A-Z]"), (String) EasyMock.matches("[A-Z][A-Z][A-Z]"))).andReturn(1.5);
Việc sử dụng phương thức EasyMock.find() thay cho phương thức EasyMock.matches() sẽ chấp nhận bất kỳ String nào có chứa một chuỗi con gồm 3 ký tự được viết hoa.
EasyMock có những phương thức tương tự cho các loại dữ liệu nguyên thuỷ:
EasyMock.anyInt()
EasyMock.anyShort()
EasyMock.anyByte()
EasyMock.anyLong()
EasyMock.anyFloat()
EasyMock.anyDouble()
EasyMock.anyBoolean()
Đối với các giá trị kiểu số, bạn cũng có thể sử dụng phương thức EasyMock.lt(x) để chấp nhận bất kỳ giá trị nào nhỏ hơn x, hoặc phương thức EasyMock.gt (x) để chấp nhận bất kỳ giá trị nào lớn hơn x.
Khi kiểm tra một dãy dài các kết quả mong đợi, bạn có thể thu được các kết quả hay đối số của một lời gọi phương thức và so sánh nó với giá trị được chuyển cho lời gọi phương thức khác. Và cuối cùng, bạn có thể định nghĩa các phép so khớp (matchers) tùy chỉnh, kiểm tra hầu như bất kỳ chi tiết nào về các đối số mà bạn có thể tưởng tượng ra, mặc dù quá trình để làm như vậy hơi phức tạp. Tuy nhiên, đối với hầu hết các phép kiểm thử, các phép so khớp như EasyMock.anyInt(), EasyMock.matches() và EasyMock.eq() là đủ.
Các đối tượng giả nghiêm ngặt và kiểm tra trình tự
EasyMock không chỉ kiểm tra rằng các phương thức dự kiến sẽ được gọi với các đối số đúng. Nó cũng có thể xác minh rằng bạn gọi các phương thức đó và chỉ những phương thức đó, theo đúng trình tự. Việc kiểm tra này không được thực hiện theo mặc định. Để bật tính năng này, bạn hãy gọi phương thức EasyMock.verify(mock) tại phần cuối của phương thức kiểm thử của bạn. Ví dụ, Liệt kê 6 bây giờ sẽ thất bại nếu phương thức toEuros() gọi phương thức getRate() nhiều lần:
Liệt kê 6. Kiểm tra rằng phương thức
getRate() được gọi chỉ một lần
public void testToEuros() throws IOException { Currency expected = new Currency(3.75, "EUR"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertEquals(expected, actual); EasyMock.verify(mock); }
Chính xác phương thức EasyMock.verify() thực hiện kiểm tra như thế nào thực sự phụ thuộc vào các chế độ có sẵn mà nó vận hành theo:
- Chế độ bình thường
—
EasyMock.createMock(): Tất cả các phương thức dự kiến sẽ phải được gọi với các đối số đã chỉ rõ. Tuy nhiên, trình tự mà trong đó các phương thức này được gọi không quan trọng. Các cuộc gọi đến phương thức không dự kiến làm cho phép thử thất bại.
- Chế độ nghiêm ngặt
—
EasyMock.createStrictMock(): Tất cả các phương thức dự kiến sẽ phải được gọi với các đối số dự kiến, theo một trình tự đã chỉ rõ. Các cuộc gọi đến các phương thức không dự kiến làm cho phép thử thất bại.
- Chế độ dễ tính
—
EasyMock.createNiceMock(): Tất cả các phương thức dự kiến sẽ phải được gọi với đối số đã chỉ rõ theo trình tự bất kỳ. Các cuộc gọi đến các phương thức không dự kiến không làm cho phép thử thất bại. Các đối tượng giả dễ tính là các mặc định hợp lý cho các phương thức bạn không làm giả một cách tường minh. Các phương thức trả về giá trị số sẽ trả về giá trị 0. Các phương thức trả về giá trị boolean sẽ trả về giá trị false. Phương thức trả về đối tượng sẽ trả về giá trị null.
Việc kiểm tra trình tự và số lần mà một phương thức được gọi thậm chí hữu ích hơn trong các giao diện lớn hơn và các phép kiểm thử lớn hơn. Ví dụ: Ta hãy xem xét giao diện org.xml.sax.ContentHandler. Nếu bạn đã kiểm thử một trình phân tích cú pháp XML, bạn hẳn đã muốn nhập vào các tài liệu và muốn kiểm tra rằng trình phân tích cú pháp đã gọi đúng các phương thức trong ContentHandler theo đúng trình tự. Ví dụ, ta hãy xem xét tài liệu XML đơn giản trong liệt kê 7:
Liệt kê 7. Một tài liệu XML đơn giản
<root> Hello World! </root>
Theo đặc tả kỹ thuật SAX, khi trình phân tích cú pháp phân tích tài liệu này, nó cần phải gọi những phương thức dưới đây theo trình tự sau:
setDocumentLocator()
startDocument()
startElement()
characters()
endElement()
endDocument()
Tuy nhiên, chỉ để làm cho vấn đề thú vị hơn, cuộc gọi đến phương thức setDocumentLocator() là tùy chọn; trình phân tích cú pháp được phép gọi phương thức characters() nhiều lần. Chúng không cần phải chuyển luồng văn bản dài tối đa trong một cuộc gọi duy nhất, và trong thực tế, hầu hết chúng không làm như vậy. Điều này khó kiểm thử bằng các phương thức truyền thống, ngay cả đối với một tài liệu đơn giản như liệt kê 7, nhưng EasyMock làm cho nó trở nên đơn giản hơn, như trong liệt kê 8:
Liệt kê 8. Kiểm thử một trình phân tích cú pháp XML
import java.io.*; import org.easymock.EasyMock; import org.xml.sax.*; import org.xml.sax.helpers.XMLReaderFactory; import junit.framework.TestCase; public class XMLParserTest extends TestCase { private XMLReader parser; protected void setUp() throws Exception { parser = XMLReaderFactory.createXMLReader(); } public void testSimpleDoc() throws IOException, SAXException { String doc = "<root>\n Hello World!\n</root>"; ContentHandler mock = EasyMock.createStrictMock(ContentHandler.class); mock.setDocumentLocator((Locator) EasyMock.anyObject()); EasyMock.expectLastCall().times(0, 1); mock.startDocument(); mock.startElement(EasyMock.eq(""), EasyMock.eq("root"), EasyMock.eq("root"), (Attributes) EasyMock.anyObject()); mock.characters((char[]) EasyMock.anyObject(), EasyMock.anyInt(), EasyMock.anyInt()); EasyMock.expectLastCall().atLeastOnce(); mock.endElement(EasyMock.eq(""), EasyMock.eq("root"), EasyMock.eq("root")); mock.endDocument(); EasyMock.replay(mock); parser.setContentHandler(mock); InputStream in = new ByteArrayInputStream(doc.getBytes("UTF-8")); parser.parse(new InputSource(in)); EasyMock.verify(mock); } }
Phép kiểm thử này cho thấy một số thủ thuật mới. Trước tiên, nó sử dụng chế độ giả nghiêm ngặt, vì vậy cần phải có một trình tự. Ví dụ, bạn không muốn trình phần tích cú pháp gọi phương thức endDocument() trước khi gọi phương thức startDocument().
Tiếp theo, các phương thức tôi đang kiểm thử đều trả về giá trị rỗng (void). Điều đó có nghĩa là tôi không thể chuyển chúng dưới dạng các đối số của phương thức EasyMock.expect(), như tôi đã làm với phương thức getRate(). (EasyMock đánh lừa trình biên dịch về rất nhiều điều, nhưng nó không đủ thông minh để đánh lừa trình biên dịch tin rằng giá trị rỗng là một kiểu đối số hợp pháp). Thay vào đó, tôi chỉ cần gọi phương thức rỗng trên đối tượng giả và EasyMock thu kết quả. Nếu tôi cần thay đổi một số chi tiết của các kết quả mong đợi, thì sau đó tôi gọi phương thức EasyMock.expectLastCall() ngay sau khi gọi phương thức làm giả. Bạn cũng phải lưu ý rằng bạn không thể chuyển bất kỳ các giá trị kiểu chuỗi và các giá trị nguyên và các mảng như là đối số mong đợi. Trước tiên tất cả các giá trị đó phải được bọc lại với phương thức EasyMock.eq() để các giá trị của chúng có thể được thu giữ như mong đợi.
Liệt kê 8 sử dụng phương thức EasyMock.expectLastCall() để điều chỉnh số lần mà các phương thức có thể được gọi. Theo mặc định, mỗi phương thức chỉ được gọi một lần. Tuy nhiên, tôi làm cho phương thức setDocumentLocator() thành tùy chọn bằng cách đặt số lần gọi .times(0, 1). Điều này có nghĩa là phương thức đó sẽ được gọi từ 0 đến 1 lần. Tất nhiên, bạn có thể thay đổi các đối số để cho các phương thức được gọi từ 1-10 lần, 3-30 lần, hoặc bất kỳ vùng giá trị nào mà bạn muốn. Đối với phương thức characters(), tôi thực sự không biết bao nhiêu lần nó sẽ được gọi, ngoại trừ việc nó phải được gọi ít nhất một lần, vì vậy tôi đặt là .atLeastOnce(). Nếu đây là một phương thức không trả về rỗng, thì tôi đã có thể áp dụng times(0, 1) và atLeastOnce() để đặt giá trị mong đợi một cách trực tiếp. Tuy nhiên, do các phương thức được làm giả trả về giá trị rỗng, nên tôi phải nhằm đến chúng với phương thức EasyMock.expectLastCall() để thay thế.
Cuối cùng, bạn hãy lưu ý việc sử dụng các phương thức EasyMock.anyObject() và EasyMock.anyInt() cho các đối số của phương thức characters(). Việc này tính toán đến nhiều cách khác nhau mà trình phân tích cú pháp được phép làm để chuyển văn bản vào phương thức ContentHandler.
Các đối tượng giả và thực tế
EasyMock có đáng giá không? Nó không làm được bất cứ cái gì mà khi viết các lớp giả một cách thủ công không thể thực hiện được, và trong trường hợp các lớp được viết theo cách thủ công thì dự án của bạn sẽ bớt đi một hay hai phần phụ thuộc. Ví dụ: liệt kê 3 là một trường hợp, ở đây đối tượng giả được viết một cách thủ công bằng cách sử dụng một lớp vô danh bên trong hầu như cũng nhỏ gọn như thế và có thể là dễ đọc hơn đối với các nhà phát triển phần mềm chưa quen với EasyMock. Tuy nhiên, đó là một ví dụ ngắn mà tôi chọn có chủ ý cho mục đích của một bài viết. Khi ta làm giả các giao diện lớn hơn chẳng hạn như org.w3c.dom.Node (có 25 phương thức), hoặc java.sql.ResultSet (có 139 phương thức và đang tăng lên), thì EasyMock là một công cụ tiết kiệm thời gian rất lớn, nó sản xuất ra những mã ngắn hơn nhiều và dễ đọc hơn với chi phí tối thiểu.
Bây giờ là lời cảnh báo: Các đối tượng giả có thể được sử dụng quá đà. Ta có thể làm giả rất nhiều thứ đến nỗi một phép thử luôn luôn thành công ngay cả khi mã bị hỏng nghiêm trọng. Bạn càng tạo nhiều đối tượng giả, thì bạn kiểm thử càng ít. Nhiều lỗi tồn tại trong các thư viện phụ thuộc và trong sự tương tác giữa một phương thức và các phương thức mà nó gọi đến. Làm giả các phần phụ thuộc có thể che giấu rất nhiều lỗi mà đúng ra bạn phải thực sự tìm ra. Việc tạo đối tượng giả không nên là lựa chọn đầu tiên của bạn trong bất kỳ tình huống nào. Nếu bạn có thể sử dụng một phụ thuộc thực, thì bạn hãy làm như vậy. Một đối tượng giả là một sự thay thế kém hơn cho một lớp thực. Tuy nhiên, nếu bạn không thể kiểm thử một cách đáng tin cậy và tự động với các lớp thực vì bất cứ lý do gì, thì kiểm thử bằng một đối tượng giả tốt hơn nhiều là không kiểm thử gì cả.
Tài nguyên
Học tập
- Các lớp uỷ nhiệm động: EasyMock được thực hiện bằng cách sử dụng các uỷ nhiệm động được đưa vào trở lại trong Java 1.3.
- "Kiểm thử đơn vị với các đối tượng giả" (Alexander Chaffee và William Pietri, developerWorks, tháng 11 năm 2002): Giới thiệu tổng quát các khái niệm về đối tượng giả bằng cách sử dụng các đối tượng giả được viết thủ công.
- "Endo-Testing: Kiểm thử đơn vị với các đối tượng giả" (Tim Mackinnon, Steve Freeman và Philip Craig, 2000): Bài báo này, được trình bày tại hội nghị XP2000, đã đưa ra thuật ngữ đối tượng giả (mock objects).
- "Kiến trúc tiến hóa và thiết kế nổi dần: Thiết kế hướng theo kiểm thử, phần 1" (Neal Ford, developerWorks, tháng 2 năm 2009): Tìm hiểu phát triển hướng theo kiểm thử có thể cải thiện thiết kế tổng thể mã của bạn như thế nào.
- Tham quan Hiệu sách công nghệ để tìm sách về chủ đề này và về các chủ đề kỹ thuật khác.
- Vùng công nghệ Java của developerWorks: Tìm hàng trăm bài báo về mọi khía cạnh của lập trình Java.
Lấy sản phẩm và công nghệ
- EasyMock: Cài đặt hệ thống EasyMock.
- cglib 2.1: Thư viện thao tác bytecode mã nguồn mở mà bạn sẽ cần cài đặt để sử dụng phần mở rộng về lớp của EasyMock.
Thảo luận
- Xem trang developerWorks blogs và tham gia vào cộng đồng developerWorks.
Bình luận
-
Vùng dữ liệu trên developerWorks
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
-
Vùng mã nguồn mở trên developerWorks
Xem các bài viết về HTML, CSS, JavaScript,...
-
Điện toán đám mây
Tìm hiểu về điện toán đám mây

markdown:
Phát triển hướng theo kiểm thử là một thành phần quan trọng của việc phát
triển phần mềm. Nếu mã lệnh không được kiểm thử, thì nó sẽ đổ vỡ. Tất cả
mã lệnh phải được kiểm thử, và điều lý tưởng là các phép kiểm thử phải
được viết trước khi viết mã của mô hình. Nhưng có một số thứ dễ dàng được
kiểm thử hơn những thứ khác. Nếu bạn đang viết một lớp đơn giản để biểu
diễn tiền tệ, thì rất dễ dàng để kiểm thử rằng bạn có thể cộng $ 1.23 với
2.28 € và nhận được kết quả là $ 4.03 và không phải là $ 3.03 hoặc $
4,029999998. Ta cũng không gặp nhiều khó khăn hơn để kiểm thử rằng ta
không thể tạo ra một số tiền là $ 7.465. Nhưng làm thế nào để bạn kiểm thử
phương thức quy đổi $ 7.50 thành 5.88 € - nhất là khi tỷ giá hối đoái được
áp dụng bằng cách kết nối đến một cơ sở dữ liệu sống, với các thông tin
được cập nhật liên tục mỗi giây? Kết quả đúng của phương thức
amount.toEuros() có thể thay đổi mỗi khi bạn chạy chương
trình.
Câu trả lời là các đối tượng giả
*(mock objects)*. Thay vì kết nối
với một máy chủ thực cung cấp thông tin về tỷ giá được cập nhật mỗi phút,
phép kiểm thử kết nối tới một máy chủ giả luôn luôn trả về cùng tỷ giá hối
đoái. Thế thì bạn có một kết quả dự đoán trước được mà bạn có thể kiểm
thử. Sau cùng, mục tiêu là kiểm thử lôgic hoạt động trong phương thức
toEuros() chứ không phải kiểm tra máy chủ có gửi đi các giá
trị chính xác hay không. (Hãy để cho các nhà phát triển đã xây dựng máy
chủ lo việc này). Loại đối tượng giả này đôi khi được gọi là đồ giả
*(fake)*.
Các đối tượng giả cũng có thể hữu ích cho việc kiểm thử các điều kiện lỗi.
Ví dụ: Điều gì sẽ xảy ra nếu phương thức
toEuros() cố gắng
lấy ra tỷ giá mới nhất, khi mạng bị hỏng? Bạn có thể tháo cáp mạng
Ethernet khỏi máy tính của mình và sau đó chạy phép kiểm thử của bạn,
nhưng ta sẽ không cần nhiều công sức để viết một đối tượng giả, mô phỏng
một lỗi mạng.
Các đối tượng giả cũng có thể được dùng để do thám hành vi của một lớp. Bằng cách đặt các xác nhận bên trong mã đối tượng giả, bạn có thể xác minh được rằng mã đang được kiểm thử chuyển các đối số đúng đắn cho các đối tượng cộng tác với nó vào đúng thời điểm. Đối tượng giả có thể cho phép bạn xem và kiểm thử các phần riêng tư (private) của một lớp mà không để lộ chúng ra qua các phương thức công cộng không cần thiết khác.
Cuối cùng, các đối tượng giả giúp loại bỏ khỏi phép kiểm thử các phụ thuộc cồng kềnh. Chúng làm cho các phép kiểm thử trở nên một đơn vị trọn vẹn hơn. Thất bại trong phép kiểm thử dùng một đối tượng giả sẽ nhiều khả năng là thất bại trong phương thức đang được kiểm thử hơn là ở trong một phụ thuộc của nó. Điều này giúp cô lập vấn đề và làm cho việc gỡ lỗi trở nên đơn giản hơn.
EasyMock là một thư viện đối tượng giả mã nguồn mở cho ngôn ngữ lập trình Java, giúp bạn nhanh chóng và dễ dàng tạo ra các đối tượng giả cho tất cả các mục đích đó. Nhờ sự kỳ diệu của phép ủy nhiệm (proxy) động, EasyMock cho phép bạn tạo ra một triển khai thực hiện cơ sở của bất kỳ giao diện nào chỉ với một dòng mã lệnh. Bằng cách thêm phần mở rộng về lớp của EasyMock, bạn cũng có thể tạo ra các cái làm giả (mocks) các lớp. Các giả lớp này có thể được cấu hình cho bất kỳ mục đích nào, từ các đối số giả đơn giản để điền vào một chữ ký phương thức đến các trình do thám đa triệu gọi (multi-invocation), nhằm xác minh một dãy dài các cuộc gọi phương thức.
## Giới thiệu về EasyMock
Tôi sẽ bắt đầu bằng một ví dụ cụ thể để chứng tỏ EasyMock làm việc như thế
nào. Liệt kê 1 là giao diện
ExchangeRate giả định. Giống như
bất kỳ giao diện nào, nó chỉ đơn giản nói lên những gì mà một cá thể làm
chứ không chỉ rõ cá thể làm điều đó như thế nào. Ví dụ: Nó không nói các
dữ liệu về tỷ giá hối đoái đến từ trang Yahoo finance, từ chính phủ, hay
từ nơi nào khác.
##### Liệt kê 1. Giao diện
ExchangeRate
import java.io.IOException; public interface ExchangeRate { double getRate(String inputCurrency, String outputCurrency) throws IOException; }
Liệt kê 2 là bộ xương sườn của lớp
Currency (tiền tệ) giả
định. Nó thực sự khá phức tạp, và nó cũng có thể có lỗi. (Tôi tránh cho
bạn khỏi phải hồi hộp: nó có lỗi – thực sự cũng kha khá lỗi)
##### Liệt kê 2. Lớp
Currency
import java.io.IOException; public class Currency { private String units; private long amount; private int cents; public Currency(double amount, String code) { this.units = code; setAmount(amount); } private void setAmount(double amount) { this.amount = new Double(amount).longValue(); this.cents = (int) ((amount * 100.0) % 100); } public Currency toEuros(ExchangeRate converter) { if ("EUR".equals(units)) return this; else { double input = amount + cents/100.0; double rate; try { rate = converter.getRate(units, "EUR"); double output = input * rate; return new Currency(output, "EUR"); } catch (IOException ex) { return null; } } } public boolean equals(Object o) { if (o instanceof Currency) { Currency other = (Currency) o; return this.units.equals(other.units) && this.amount == other.amount && this.cents == other.cents; } return false; } public String toString() { return amount + "." + Math.abs(cents) + " " + units; } }
Nhìn thoáng qua, có thể chưa thấy rõ ràng ngay một điều quan trọng về thiết
kế của lớp
Currency. Tỷ giá hối đoái được chuyển từ bên ngoài
lớp vào. Nó không được xây dựng ở bên trong lớp. Điều này là rất trọng
yếu, cho phép tôi làm giả tỷ giá hối đoái để các phép kiểm thử có thể chạy
mà không cần nói chuyện với máy chủ tỷ giá hối đoái thực. Nó cũng cho phép
các ứng dụng phía khách cung cấp các nguồn khác nhau của dữ liệu tỷ giá
hối đoái.
Liệt kê 3 trình bày một phép kiểm thử JUnit để xác minh rằng $ 2.50 đã được
quy đổi thành 3.75 € khi tỷ giá hối đoái là 1.5. EasyMock được sử dụng để
tạo ra đối tượng
ExchangeRate luôn cung cấp giá trị 1.5.
##### Liệt kê 3. Lớp
CurrencyTest
import junit.framework.TestCase; import org.easymock.EasyMock; import java.io.IOException; public class CurrencyTest extends TestCase { public void testToEuros() throws IOException { Currency testObject = new Currency(2.50, "USD"); Currency expected = new Currency(3.75, "EUR"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertEquals(expected, actual); } }
Bạn hãy chạy phép thử này và nó thoát thành công. Điều gì đã xảy ra? Ta hãy nhìn vào từng dòng lệnh một của phép kiểm thử. Trước tiên đối tượng kiểm thử và kết quả dự kiến được xây dựng:
Currency testObject = new Currency(2.50, "USD"); Currency expected = new Currency(3.75, "EUR");
Chưa có gì mới.
Tiếp theo tôi tạo một phiên bản giả của giao diện
ExchangeRate
bằng cách gửi đối tượng
Class cho giao diện này tới cho
phương thức tĩnh
EasyMock.createMock():
ExchangeRate mock = EasyMock.createMock(ExchangeRate.class);
Đây là một phần huyền bí nhất. Hãy lưu ý rằng tôi chưa hề viết một lớp thực
hiện giao diện
ExchangeRate nào. Hơn nữa, tuyệt đối không có
cách nào mà phương thức
EasyMock.createMock() có thể được
được định kiểu để trả về một cá thể
ExchangeRate, một kiểu mà
nó chưa bao giờ biết đến và tôi đã tạo ra chỉ vì bài viết này. Và ngay cả
khi nếu bởi một phép mầu nào đó, nó trả về một
ExchangeRate,
thì điều gì xảy ra khi tôi cần làm giả một cá thể của một giao diện khác?
Lần đầu tiên tôi thấy điều này tôi gần như ngã ngửa người vì ngạc nhiên.
Tôi không tin rằng mã này có thể biên dịch được, và nó đã làm được điều
đó. Có một ma thuật bí ẩn ở đây, nó là kết quả của sự kết hợp giữa đặc
điểm chung của Java 5 với phép ủy nhiệm động đã được đưa vào kể từ Java
phiên bản 1.3 (xem phần
[Tài nguyên](#resources)). May mắn
thay, để sử dụng nó (và thán phục sự thông minh của các lập trình viên đã
phát minh ra các thủ thuật này), bạn không cần phải hiểu cách nó hoạt động
như thế nào.
Bước tiếp theo thực sự đáng ngạc nhiên. Để báo cho đối tượng giả những gì
mà mình mong đợi, tôi gọi phương thức như một đối số của phương thức
EasyMock.expect(). Sau đó, tôi gọi phương thức
andReturn() để chỉ rõ những gì sẽ là kết quả của việc gọi
phương thức này:
EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5);
EasyMock ghi lại hành động triệu gọi này và nó biết sau này cần làm những gì.
Tiếp theo tôi làm cho đối tượng giả sẵn sàng phát lại dữ liệu đã được ghi
lại của nó bằng cách gọi phương thức
EasyMock.replay():
EasyMock.replay(mock);
Đây là một phần của thiết kế mà tôi nhận thấy có một chút rối rắm. Phương
thức
EasyMock.replay() không thực sự phát lại đối tượng giả.
Thay vào đó, nó thiết đặt lại đối tượng giả để lần sau khi các phương thức
của nó được gọi, nó sẽ bắt đầu việc phát lại.
Bây giờ đối tượng giả đã được chuẩn bị xong, tôi chuyển nó như một đối số tới cho phương thức đang được kiểm thử:
Currency actual = testObject.toEuros(mock);
Cuối cùng, tôi kiểm tra xem câu trả lời có đúng như mong đợi không:
assertEquals(expected, actual);
Và tất cả chỉ có thế. Bất cứ lúc nào bạn có một giao diện cần phải trả những về kết quả nhất định dành cho mục đích của kiểm thử, thì bạn có thể chỉ cần tạo nhanh ra một đối tượng giả. Điều này thực sự dễ dàng. Giao diện ExchangeRate đủ nhỏ và đơn giản để tôi có thể viết thủ công một cách dễ dàng một lớp giả. Tuy nhiên, giao diện càng lớn và càng phức tạp, thì càng mất nhiều công để viết các đối tượng giả riêng lẻ cho mỗi kiểm thử đơn vị. EasyMock cho phép bạn thực hiện các giao diện lớn như java.sql.ResultSet hoặc org.xml.sax.ContentHandler bằng một dòng mã, và sau đó cung cấp cho chúng đủ hành vi để chạy phép kiểm thử của bạn.
## Kiểm tra các ngoại lệ
Một trong những sử dụng phổ biến hơn của đối tượng giả là để kiểm thử các điều kiện ngoại lệ. Ví dụ: Bạn không thể dễ dàng tạo ra một vụ hỏng mạng theo yêu cầu của mình, nhưng bạn có thể tạo ra vụ hỏng giả, phỏng theo vụ hỏng thực.
Lớp Currency được giả định là trả về kết quả null khi phương thức getRate() đưa ra một ngoại lệ IOException. Liệt kê 4 kiểm thử điều này:
##### Liệt kê 4. Kiểm thử xem một phương thức đưa ra ngoại lệ đúng
public void testExchangeRateServerUnavailable() throws IOException { Currency testObject = new Currency(2.50, "USD"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andThrow(new IOException()); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertNull(actual); }
Đoạn mã mới ở đây là phương thức andThrow(). Như bạn có thể đã đoán được, đoạn mã này chỉ ra lệnh cho phương thức getRate () đưa ra một ngoại lệ đã định khi được gọi.
Bạn có thể trả về bất kỳ loại ngoại lệ nào mà bạn thích – ngoại lệ đã kiểm tra (checked), ngoại lệ thời gian chạy (runtime) hoặc lỗi (error) - chừng nào mà chữ ký phương thức còn hỗ trợ nó. Điều này đặc biệt hữu ích để kiểm thử các điều kiện đặc biệt hiếm khi xảy ra (Ví dụ như lỗi tràn bộ nhớ hoặc không tìm thấy định nghĩa lớp) hoặc các điều kiện chỉ ra lỗi máy ảo (ví dụ như có không có mã ký tự UTF-8).
## Thiết đặt các kết quả mong đợi
EasyMock không chỉ cung cấp cho câu trả lời làm sẵn cho các câu hỏi được làm sẵn. Nó cũng có thể kiểm tra xem đầu vào có đúng những gì cần phải có hay không. Ta lấy ví dụ, giả sử rằng phương thức toEuros() có lỗi như trong liệt kê 5, tại đây nó sẽ trả về một kết quả tính bằng đồng euro nhưng lại lấy tỷ giá hối đoái cho đồng đô la Canada. Điều này có thể làm ai đó được hoặc bị mất rất nhiều tiền.
##### Liệt kê 5. Một phương thức toEuros() bị lỗi
public Currency toEuros(ExchangeRate converter) { if ("EUR".equals(units)) return this; else { double input = amount + cents/100.0; double rate; try { rate = converter.getRate(units, "CAD"); double output = input * rate; return new Currency(output, "EUR"); } catch (IOException e) { return null; } } }
Tuy nhiên, tôi không cần phải làm một phép kiểm thử bổ sung cho việc này.
Đoạn mã testToEuros trong
[Liệt kê 4](#listing4) đã bắt lỗi này
rồi. Khi bạn chạy phép thử này với mã bị lỗi trong liệt kê 4, thì phép thử
sẽ không thành công với thông báo lỗi sau:
"java.lang.AssertionError: Unexpected method call getRate("USD", "CAD"): getRate("USD", "EUR"): expected: 1, actual: 0".
Lưu ý rằng đây không phải là một khẳng định mà tôi tạo ra. EasyMock nhận thấy rằng các đối số mà tôi đã dùng không ăn nhập và đánh hỏng ca kiểm thử.
Theo mặc định, EasyMock chỉ cho phép các ca kiểm thử gọi những phương thức mà bạn đã định với các đối số mà bạn đã chỉ rõ. Đôi khi đây là một điều hơi quá khắt khe, do đó có những cách để nới lỏng nó. Ví dụ: Giả sử tôi muốn cho phép bất kỳ một chuỗi ký tự nào được chuyển cho phương thức getRate(), thay vì chỉ là USD và EUR. Thế thì tôi có thể chỉ rõ rằng tôi mong đợi phương thức EasyMock.anyObject () thay vì các chuỗi ký tự tường minh, như liệt kê sau:
EasyMock.expect(mock.getRate( (String) EasyMock.anyObject(), (String) EasyMock.anyObject())).andReturn(1.5);
Tôi có thể đào sâu thêm một chút và chỉ rõ phương thức EasyMock.notNull () chỉ cho phép các chuỗi không rỗng:
EasyMock.expect(mock.getRate( (String) EasyMock.notNull(), (String) EasyMock.notNull())).andReturn(1.5);
Việc kiểm tra kiểu tĩnh sẽ ngăn không cho giá trị không phải là chuỗi ký tự được chuyển cho phương thức này. Tuy nhiên, bây giờ tôi cho phép cả các giá trị kiểu String ngoài USD và EUR. Bạn có thể sử dụng các biểu thức chính quy để được thể hiện tường minh hơn với phương thức EasyMock.matches (). Ở đây tôi yêu cầu một chuỗi ký tự ASCII gồm ba ký tự, viết hoa:
EasyMock.expect(mock.getRate( (String) EasyMock.matches("[A-Z][A-Z][A-Z]"), (String) EasyMock.matches("[A-Z][A-Z][A-Z]"))).andReturn(1.5);
Việc sử dụng phương thức EasyMock.find() thay cho phương thức EasyMock.matches() sẽ chấp nhận bất kỳ String nào có chứa một chuỗi con gồm 3 ký tự được viết hoa.
EasyMock có những phương thức tương tự cho các loại dữ liệu nguyên thuỷ:
EasyMock.anyInt()
EasyMock.anyShort()
EasyMock.anyByte()
EasyMock.anyLong()
EasyMock.anyFloat()
EasyMock.anyDouble()
EasyMock.anyBoolean()
Đối với các giá trị kiểu số, bạn cũng có thể sử dụng phương thức EasyMock.lt(x) để chấp nhận bất kỳ giá trị nào nhỏ hơn x, hoặc phương thức EasyMock.gt (x) để chấp nhận bất kỳ giá trị nào lớn hơn x.
Khi kiểm tra một dãy dài các kết quả mong đợi, bạn có thể thu được các kết quả hay đối số của một lời gọi phương thức và so sánh nó với giá trị được chuyển cho lời gọi phương thức khác. Và cuối cùng, bạn có thể định nghĩa các phép so khớp (matchers) tùy chỉnh, kiểm tra hầu như bất kỳ chi tiết nào về các đối số mà bạn có thể tưởng tượng ra, mặc dù quá trình để làm như vậy hơi phức tạp. Tuy nhiên, đối với hầu hết các phép kiểm thử, các phép so khớp như EasyMock.anyInt(), EasyMock.matches() và EasyMock.eq() là đủ.
## Các đối tượng giả nghiêm ngặt và kiểm tra trình tự
EasyMock không chỉ kiểm tra rằng các phương thức dự kiến sẽ được gọi với các đối số đúng. Nó cũng có thể xác minh rằng bạn gọi các phương thức đó và chỉ những phương thức đó, theo đúng trình tự. Việc kiểm tra này không được thực hiện theo mặc định. Để bật tính năng này, bạn hãy gọi phương thức EasyMock.verify(mock) tại phần cuối của phương thức kiểm thử của bạn. Ví dụ, Liệt kê 6 bây giờ sẽ thất bại nếu phương thức toEuros() gọi phương thức getRate() nhiều lần:
##### Liệt kê 6. Kiểm tra rằng phương thức
getRate() được gọi chỉ một lần
public void testToEuros() throws IOException { Currency expected = new Currency(3.75, "EUR"); ExchangeRate mock = EasyMock.createMock(ExchangeRate.class); EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5); EasyMock.replay(mock); Currency actual = testObject.toEuros(mock); assertEquals(expected, actual); EasyMock.verify(mock); }
Chính xác phương thức EasyMock.verify() thực hiện kiểm tra như thế nào thực sự phụ thuộc vào các chế độ có sẵn mà nó vận hành theo:
**Chế độ bình thường —**: Tất cả các phương thức dự kiến sẽ phải được gọi với các đối số đã chỉ rõ. Tuy nhiên, trình tự mà trong đó các phương thức này được gọi không quan trọng. Các cuộc gọi đến phương thức không dự kiến làm cho phép thử thất bại.
EasyMock.createMock()
**Chế độ nghiêm ngặt —**: Tất cả các phương thức dự kiến sẽ phải được gọi với các đối số dự kiến, theo một trình tự đã chỉ rõ. Các cuộc gọi đến các phương thức không dự kiến làm cho phép thử thất bại.
EasyMock.createStrictMock()
**Chế độ dễ tính —**: Tất cả các phương thức dự kiến sẽ phải được gọi với đối số đã chỉ rõ theo trình tự bất kỳ. Các cuộc gọi đến các phương thức không dự kiến không làm cho phép thử thất bại. Các đối tượng giả dễ tính là các mặc định hợp lý cho các phương thức bạn không làm giả một cách tường minh. Các phương thức trả về giá trị số sẽ trả về giá trị 0. Các phương thức trả về giá trị boolean sẽ trả về giá trị false. Phương thức trả về đối tượng sẽ trả về giá trị null.
EasyMock.createNiceMock()
Việc kiểm tra trình tự và số lần mà một phương thức được gọi thậm chí hữu ích hơn trong các giao diện lớn hơn và các phép kiểm thử lớn hơn. Ví dụ: Ta hãy xem xét giao diện org.xml.sax.ContentHandler. Nếu bạn đã kiểm thử một trình phân tích cú pháp XML, bạn hẳn đã muốn nhập vào các tài liệu và muốn kiểm tra rằng trình phân tích cú pháp đã gọi đúng các phương thức trong ContentHandler theo đúng trình tự. Ví dụ, ta hãy xem xét tài liệu XML đơn giản trong liệt kê 7:
##### Liệt kê 7. Một tài liệu XML đơn giản
<root> Hello World! </root>
Theo đặc tả kỹ thuật SAX, khi trình phân tích cú pháp phân tích tài liệu này, nó cần phải gọi những phương thức dưới đây theo trình tự sau:
setDocumentLocator()
startDocument()
startElement()
characters()
endElement()
endDocument()
Tuy nhiên, chỉ để làm cho vấn đề thú vị hơn, cuộc gọi đến phương thức setDocumentLocator() là tùy chọn; trình phân tích cú pháp được phép gọi phương thức characters() nhiều lần. Chúng không cần phải chuyển luồng văn bản dài tối đa trong một cuộc gọi duy nhất, và trong thực tế, hầu hết chúng không làm như vậy. Điều này khó kiểm thử bằng các phương thức truyền thống, ngay cả đối với một tài liệu đơn giản như liệt kê 7, nhưng EasyMock làm cho nó trở nên đơn giản hơn, như trong liệt kê 8:
##### Liệt kê 8. Kiểm thử một trình phân tích cú pháp XML
import java.io.*; import org.easymock.EasyMock; import org.xml.sax.*; import org.xml.sax.helpers.XMLReaderFactory; import junit.framework.TestCase; public class XMLParserTest extends TestCase { private XMLReader parser; protected void setUp() throws Exception { parser = XMLReaderFactory.createXMLReader(); } public void testSimpleDoc() throws IOException, SAXException { String doc = "<root>\n Hello World!\n</root>"; ContentHandler mock = EasyMock.createStrictMock(ContentHandler.class); mock.setDocumentLocator((Locator) EasyMock.anyObject()); EasyMock.expectLastCall().times(0, 1); mock.startDocument(); mock.startElement(EasyMock.eq(""), EasyMock.eq("root"), EasyMock.eq("root"), (Attributes) EasyMock.anyObject()); mock.characters((char[]) EasyMock.anyObject(), EasyMock.anyInt(), EasyMock.anyInt()); EasyMock.expectLastCall().atLeastOnce(); mock.endElement(EasyMock.eq(""), EasyMock.eq("root"), EasyMock.eq("root")); mock.endDocument(); EasyMock.replay(mock); parser.setContentHandler(mock); InputStream in = new ByteArrayInputStream(doc.getBytes("UTF-8")); parser.parse(new InputSource(in)); EasyMock.verify(mock); } }
Phép kiểm thử này cho thấy một số thủ thuật mới. Trước tiên, nó sử dụng chế độ giả nghiêm ngặt, vì vậy cần phải có một trình tự. Ví dụ, bạn không muốn trình phần tích cú pháp gọi phương thức endDocument() trước khi gọi phương thức startDocument().
Tiếp theo, các phương thức tôi đang kiểm thử đều trả về giá trị rỗng (void). Điều đó có nghĩa là tôi không thể chuyển chúng dưới dạng các đối số của phương thức EasyMock.expect(), như tôi đã làm với phương thức getRate(). (EasyMock đánh lừa trình biên dịch về rất nhiều điều, nhưng nó không đủ thông minh để đánh lừa trình biên dịch tin rằng giá trị rỗng là một kiểu đối số hợp pháp). Thay vào đó, tôi chỉ cần gọi phương thức rỗng trên đối tượng giả và EasyMock thu kết quả. Nếu tôi cần thay đổi một số chi tiết của các kết quả mong đợi, thì sau đó tôi gọi phương thức EasyMock.expectLastCall() ngay sau khi gọi phương thức làm giả. Bạn cũng phải lưu ý rằng bạn không thể chuyển bất kỳ các giá trị kiểu chuỗi và các giá trị nguyên và các mảng như là đối số mong đợi. Trước tiên tất cả các giá trị đó phải được bọc lại với phương thức EasyMock.eq() để các giá trị của chúng có thể được thu giữ như mong đợi.
[Liệt kê 8](#listing8) sử dụng phương thức
EasyMock.expectLastCall() để điều chỉnh số lần mà các phương thức có thể
được gọi. Theo mặc định, mỗi phương thức chỉ được gọi một lần. Tuy nhiên,
tôi làm cho phương thức setDocumentLocator() thành tùy chọn bằng cách đặt
số lần gọi .times(0, 1). Điều này có nghĩa là phương thức đó sẽ được gọi
từ 0 đến 1 lần. Tất nhiên, bạn có thể thay đổi các đối số để cho các
phương thức được gọi từ 1-10 lần, 3-30 lần, hoặc bất kỳ vùng giá trị nào
mà bạn muốn. Đối với phương thức characters(), tôi thực sự không biết bao
nhiêu lần nó sẽ được gọi, ngoại trừ việc nó phải được gọi ít nhất một lần,
vì vậy tôi đặt là .atLeastOnce(). Nếu đây là một phương thức không trả về
rỗng, thì tôi đã có thể áp dụng times(0, 1) và atLeastOnce() để đặt giá
trị mong đợi một cách trực tiếp. Tuy nhiên, do các phương thức được làm
giả trả về giá trị rỗng, nên tôi phải nhằm đến chúng với phương thức
EasyMock.expectLastCall() để thay thế.
Cuối cùng, bạn hãy lưu ý việc sử dụng các phương thức EasyMock.anyObject() và EasyMock.anyInt() cho các đối số của phương thức characters(). Việc này tính toán đến nhiều cách khác nhau mà trình phân tích cú pháp được phép làm để chuyển văn bản vào phương thức ContentHandler.
## Các đối tượng giả và thực tế
EasyMock có đáng giá không? Nó không làm được bất cứ cái gì mà khi viết các lớp giả một cách thủ công không thể thực hiện được, và trong trường hợp các lớp được viết theo cách thủ công thì dự án của bạn sẽ bớt đi một hay hai phần phụ thuộc. Ví dụ: liệt kê 3 là một trường hợp, ở đây đối tượng giả được viết một cách thủ công bằng cách sử dụng một lớp vô danh bên trong hầu như cũng nhỏ gọn như thế và có thể là dễ đọc hơn đối với các nhà phát triển phần mềm chưa quen với EasyMock. Tuy nhiên, đó là một ví dụ ngắn mà tôi chọn có chủ ý cho mục đích của một bài viết. Khi ta làm giả các giao diện lớn hơn chẳng hạn như org.w3c.dom.Node (có 25 phương thức), hoặc java.sql.ResultSet (có 139 phương thức và đang tăng lên), thì EasyMock là một công cụ tiết kiệm thời gian rất lớn, nó sản xuất ra những mã ngắn hơn nhiều và dễ đọc hơn với chi phí tối thiểu.
Bây giờ là lời cảnh báo: Các đối tượng giả có thể được sử dụng quá đà. Ta có thể làm giả rất nhiều thứ đến nỗi một phép thử luôn luôn thành công ngay cả khi mã bị hỏng nghiêm trọng. Bạn càng tạo nhiều đối tượng giả, thì bạn kiểm thử càng ít. Nhiều lỗi tồn tại trong các thư viện phụ thuộc và trong sự tương tác giữa một phương thức và các phương thức mà nó gọi đến. Làm giả các phần phụ thuộc có thể che giấu rất nhiều lỗi mà đúng ra bạn phải thực sự tìm ra. Việc tạo đối tượng giả không nên là lựa chọn đầu tiên của bạn trong bất kỳ tình huống nào. Nếu bạn có thể sử dụng một phụ thuộc thực, thì bạn hãy làm như vậy. Một đối tượng giả là một sự thay thế kém hơn cho một lớp thực. Tuy nhiên, nếu bạn không thể kiểm thử một cách đáng tin cậy và tự động với các lớp thực vì bất cứ lý do gì, thì kiểm thử bằng một đối tượng giả tốt hơn nhiều là không kiểm thử gì cả.
## Tài nguyên
### Học tập
[Các lớp uỷ nhiệm động](http://java.sun.com/javase/6/docs/technotes/guides/reflection/proxy.html): EasyMock được thực hiện bằng cách sử dụng các uỷ nhiệm động được đưa vào trở lại trong Java 1.3.
- "
[Kiểm thử đơn vị với các đối tượng giả](http://www.ibm.com/developerworks/library/j-mocktest.html?S_TACT=105AGY75)" (Alexander Chaffee và William Pietri, developerWorks, tháng 11 năm 2002): Giới thiệu tổng quát các khái niệm về đối tượng giả bằng cách sử dụng các đối tượng giả được viết thủ công.
- "
[Endo-Testing: Kiểm thử đơn vị với các đối tượng giả](http://www.connextra.com/aboutUs/mockobjects.pdf)" (Tim Mackinnon, Steve Freeman và Philip Craig, 2000): Bài báo này, được trình bày tại hội nghị XP2000, đã đưa ra thuật ngữ đối tượng giả *(mock objects)*.
- "
[" (Neal Ford, developerWorks, tháng 2 năm 2009): Tìm hiểu phát triển hướng theo kiểm thử có thể cải thiện thiết kế tổng thể mã của bạn như thế nào.](http://www.ibm.com/developerworks/vn/library/j-eaed2/) *Kiến trúc tiến hóa và thiết kế nổi dần*: Thiết kế hướng theo kiểm thử, phần 1
- Tham quan
[Hiệu sách công nghệ](http://www.ibm.com/developerworks/apps/SendTo?bookstore=safari?S_TACT=105AGY75)để tìm sách về chủ đề này và về các chủ đề kỹ thuật khác. [Vùng công nghệ Java của developerWorks](http://www.ibm.com/developerworks/java?S_TACT=105AGY75): Tìm hàng trăm bài báo về mọi khía cạnh của lập trình Java.
### Lấy sản phẩm và công nghệ
[EasyMock](http://www.easymock.org/): Cài đặt hệ thống EasyMock. [cglib 2.1](http://cglib.sourceforge.net/): Thư viện thao tác bytecode mã nguồn mở mà bạn sẽ cần cài đặt để sử dụng phần mở rộng về lớp của EasyMock.
### Thảo luận
- Xem trang
[developerWorks blogs](http://www.ibm.com/developerworks/blogs/?S_TACT=105AGY75)và tham gia vào [cộng đồng developerWorks](http://www.ibm.com/developerworks/community?S_TACT=105AGY75).
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Language: en-US


text:
Tweet
Học tiếng Trung ở đâu
Trung tâm Tiếng Trung tại Hà Nội
Học tiếng Trung với trung tâm tiếng Trung lâu đời nhất Hà Nội
Hotline
09.4400.4400
Trang chủ
Về chúng tôi
Trung tâm Tiếng Trung uy tín nhất Hà Nội
Đội ngũ giảng viên
Thành tích học viên
Cảm nhận của Học viên
Chương trình đào tạo
Tiếng Trung giao tiếp từ đầu
Tiếng Trung giao tiếp nâng cao
Học phí & Khuyến học
Hình ảnh lớp học
Các lớp đang học
Lớp Hán ngữ 1 đang học
Lớp Hán ngữ 2 đang học
Lớp Hán ngữ 3 đang học
Lớp Hán ngữ 4 đang học
Lớp Hán ngữ 5 đang học
Lớp Hán ngữ 6 đang học
Lớp tiếng Trung VIP đang học
DVD tự học tiếng Trung
Tài liệu học tiếng Trung
Học tiếng Trung giao tiếp
Học tiếng Trung online
KHÓA HỌC TIẾNG TRUNG GIAO TIẾP TỪ ĐẦU SẮP KHAI GIẢNG
T66: khai giảng THỨ 6 ngày 03/06/2016 lịch học 19
h45 đến 21h15
thứ 2 - 4 - 6
( còn 03 chỗ )
T67: khai giảng THỨ 2 ngày 06/06/2016 lịch học
17h50 đến 19h20
thứ 2
- 4 - 6 ( còn 04 chỗ )
T68: khai giảng THỨ 5 ngày 16/06/2016 lịch học 19
h45 đến 21h15
thứ 3 - 5 - CN
( còn 05 chỗ )
N40 : khai giảng THỨ 7 ngày 04/06/2016 học 10h - 11h30 thứ 3 - 5 - 7 ( còn 03 chỗ )
N41 : khai giảng THỨ 4 ngày 29/06/2016 học 15h - 16h30 thứ 2 - 4 - 6 ( còn 07 chỗ )
Giảng viên : Vua tiếng Trung youtube Dương Châu và Thạc sỹ Quỳnh Trang - Đại học ngoại ngữ hà nội .
TÀI LIỆU HỌC TIẾNG TRUNG
PHẦN MỀM HỌC TIẾNG TRUNG
MỤC LỤC CÁC PHẦN MỀM TIẾNG TRUNG
14/12/2020 - 51944 lượt xem
Tổng hợp các phần mềm
siêu quan trọng cho người mới
học tiếng Hán
HỌC TIẾNG HÁN VỚI QQ - phần mềm chuyên dùng để viết tiếng Hán
CÁCH CÀI LẠC VIỆT TỪ ĐIỂN TIẾNG HÁN FREE
PHẦN MỀM GÕ TIẾNG HÁN SOUGOU PINYIN
CHUYỂN CHỮ HÁN SANG PHIÊN ÂM
CÁCH TRA TỪ ĐIỂN CHỮ HÁN ONLINE TIỆN LỢI
GÕ CHỮ HÁN KHÔNG CẦN DÙNG BỘ CÀI
PHẦN MỀM HỌC PHÁT ÂM TIẾNG HÁN
CÁCH GÕ CHỮ HÁN PHỒN THỂ
PHẦN MỀM TRA CHỮ HÁN CHO ĐIỆN THOẠI DI ĐỘNG
PHẦN MỀM TRA TỪ ĐIỂN TIỆN DỤNG CHINESE POPUP DICTIONARY
PHẦN MỀM HƯỚNG DẪN VIẾT CHỮ HÁN CHINESE WRITING MASTER
PHẦN MỀM KCODEC ĐỌC TẤT CẢ CÁC ĐỊNH DẠNG FILE
CÀI PHẦN MỀM IDM ĐỂ DOWN YOUTUBE
Trên đây là những
phan mem hoc tieng trung
quan trọng nhất .
Các bạn cài đặt và sử dụng nếu có gì trục trặc xin comment bên dưới đây để mình chỉnh sửa nhé .
Chúc các bạn
học tiếng trung
thành công
Tư vấn hỗ trợ miễn phí 24/7!
Tư vấn 1:
09.4400.4400
tiengtrung.vn
Tư vấn 2 :
043.8636.528
tiengtrung.vn
Than phiền-Góp ý:
0943.169.184
tiengtrung.vn
Your name
Your email
Friend's email
Mail Subject
Content
Send
Close
Tweet
Bản in
Email
Lên đầu trang
Các tin liên quan
Chinese Symbol Studio 3.8.8
04/04/2016 - 782 lượt xem
Phần mềm NJstar chuyển chữ Hán thành phiên âm,từ điển
04/04/2016 - 1331 lượt xem
PHẦN MỀM sogou CHUYÊN ĐỂ GÕ CHỮ HÁN cho win xp
04/04/2016 - 783 lượt xem
Bình luận Facebook
Bình luận Google
LỊCH KHAI GIẢNG
Tiếng Trung giao tiếp từ đầu (Hán ngữ 1)
Học tiếng Trung cấp tốc
Tiếng Trung giao tiếp nâng cao (Hán ngữ 2)
Hán Ngữ 3 - 汉语初三班
Hán Ngữ 4 - 汉语初四班
Hán ngữ 5 - 汉语初五班
Hán Ngữ 6 - 汉语初六班
Lớp học tiếng Trung online
Lớp Tiếng Trung VIP
Học Tiếng Trung online qua Skype
DẠY TIẾNG VIỆT - 越语班
HỖ TRỢ TRỰC TUYẾN
09.4400.4400
Tư vấn online
Học tiếng Trung online qua youtube
Than phiền-Góp ý:
0943.169.184
Facebook
Tin mới
Tin đọc nhiều
Mục lục các chủ đề học tiếng Trung giao tiếp
(28/09/2050)
Bí quyết phát âm chuẩn tiếng Trung
(18/02/2034)
Trung tâm tiếng Trung - tài liệu học tiếng Trung
(30/09/2030)
MỤC LỤC CÁC BÀI HÁT TIẾNG TRUNG KINH ĐIỂN
(12/09/2021)
99 ca khúc nhạc hoa hay nhất youtube
(24/12/2020)
MỤC LỤC CÁC PHẦN MỀM TIẾNG TRUNG
(14/12/2020)
MỤC LỤC NGỮ PHÁP TIẾNG TRUNG
(07/12/2020)
CLIP HƯỚNG DẪN TỰ HỌC TIẾNG TRUNG GIAO TIẾP GIÁO TRÌNH HÁN NGỮ
(04/12/2020)
CLIP HỌC TIẾNG TRUNG SÁCH HÁN NGỮ 1
(27/11/2020)
MỤC LỤC TỪ VỰNG CHUYÊN NGÀNH TIẾNG TRUNG
(27/09/2020)
MỤC LỤC TỪ VỰNG CHUYÊN NGÀNH TIẾNG TRUNG
(27/09/2020)
MỤC LỤC CÁC PHẦN MỀM TIẾNG TRUNG
(14/12/2020)
Ngữ Pháp bài 58 - tiengtrung.vn
(15/04/2015)
Học tiếng Trung với QQ - phần mềm chuyên dùng để viết tiếng trung !!
(01/08/2013)
Học tiếng Trung về chủ đề bệnh tật
(13/08/2013)
"ANH KHÔNG ĐÒI QUÀ"(BẢN GỐC TRUNG QUỐC) - ai shang ni hao gu niang
(17/12/2013)
Mục lục các chủ đề học tiếng Trung giao tiếp
(28/09/2050)
Ngữ pháp bài 67 - tiengtrung.vn
(15/04/2015)
THI HSK
(07/12/2019)
Bí quyết phát âm chuẩn tiếng Trung
(18/02/2034)
TUYỂN GIÁO VIÊN
TUYỂN NHÂN VIÊN
LIÊN HỆ
DẠY VIẾT CHỮ HÁN
CHUYỂN CHỮ HÁN SANG PHIÊN ÂM
BÍ QUYẾT HỌC TIẾNG TRUNG
TỪ VỰNG THEO CHỦ ĐIỂM
1000 CLIP HÀI TIẾNG TRUNG
CÁC BƯỚC TỰ HỌC TIẾNG TRUNG
GÕ PHIÊN ÂM TIẾNG TRUNG CÓ DẤU
TRA TỪ ĐIỂN ONLINE
CÁCH SỬA LỐI PHÁT ÂM SAI
MÁY TÍNH KHÔNG HIỆN CHỮ HÁN ?
GÕ CHỮ HÁN KHÔNG CẦN BỘ CÀI
CHỦ ĐỀ HỌC TIẾNG HOA GIAO TIẾP
LIÊN KẾT
THÔNG TIN LIÊN HỆ
TRUNG TÂM TIẾNG TRUNG
T
IENG
T
RUNG.VN
Số 10 - Ngõ 156 Hồng Mai - Bạch Mai - Hà Nội.
Hotline:
09. 4400. 4400 - 043.8636.528
Giờ làm việc :
8h sáng tới 21h15 các ngày trong tuần
(Kể cả chủ nhật )
Riêng thứ 7 làm việc từ 8h sáng tới 17h .
f

WARC-Type: response

Content-Type: application/http; msgtype=response

Cache-Control: private

Content-Type: text/html; charset=utf-8

Connection: close


text:
Danh mục bài viết
Đức Giám mục Thái Bình cử hành thánh lễ Truyền Dầu tại giáo xứ Mỹ Đình
Sáng nay 21/04/2011, tại giáo xứ Mỹ Đình (trung tâm giáo hạt Đông Hưng-Hưng Hà), Đức cha Phêrô Nguyễn Văn Đệ cùng các anh em linh mục đoàn giáo phận Thái Bình và quý cha khách, long trọng cử hành thánh lễ Truyền Dầu và tuyên hứa lại lời hứa khi chịu chức thánh, trước sự hiện diện nhiều tu sĩ đại diện các hội dòng, tu hội và hàng ngàn giáo dân trong giáo phận.
Vì lợi ích của đoàn chiên, vài năm trở lại đây thánh lễ Truyền Dầu được luân phiên cử hành tại nhà thờ trung tâm của các giáo hạt. Theo lượt, năm nay Đức cha và linh mục đoàn giáo phận tề tựu về giáo xứ Mỹ Đình – giáo xứ trung tâm của giáo hạt Đông Hưng, có cha Đaminh Phạm Quang Trung làm chánh xứ và là hạt trưởng giáo hạt Đông Hưng.
Ngay từ sáng sớm, các cha và giáo dân ở nhiều giáo xứ xa xôi cũng như những giáo xứ lân cận đã có mặt tại Mỹ Đình. 7h45 đoàn rước gồm có Đức cha, quý cha đồng tế, quý chủng sinh, quý sơ thuộc các dòng và tu hội, tu sinh và cộng đoàn tín hữu khởi đi từ khuôn viên nhà xứ tiến ra thánh đường, trong tiếng trống và tiếng kèn hùng tráng của giáo xứ Mỹ Đình. Giáo xứ Mỹ Đình chưa bao giờ có nhiều cha đến hiệp dâng thánh lễ đông như hôm nay, vì nay là ngày “sinh nhật của ơn linh mục”, Đức cha chủ tế ngỏ lời với cộng đoàn vào đầu thánh lễ.
Trong bài giảng Đức cha nhấn mạnh về Chúa Giêsu linh mục, rồi ngài liên hệ tới chức linh mục phổ quát và linh mục thừa tác.
“Thần Khí Chúa ngự trên tôi,
vì Chúa đã xức dầu tấn phong tôi,
để tôi loan báo Tin Mừng cho kẻ nghèo hèn.
Người đã sai tôi đi công bố
cho kẻ bị giam cầm biết họ được tha,
cho người mù biết họ được sáng mắt,
trả lại tự do cho người bị áp bức,
công bố một năm hồng ân của Chúa” (Lc 4,18-19).
Đức cha kêu mời cộng đoàn tín hữu sống ơn linh mục phổ quát của mình và hiệp thông với ơn linh mục thừa tác của một số Giám mục, linh mục trong giáo phận. Đức cha xin anh chị em giáo dân cầu nguyện cho các Giám mục và linh mục đoàn của giáo phận. Đức cha xin anh chị em tín hữu cầu nguyện cách riêng cho Đức giám mục F.X. Nguyễn Văn Sang, nguyên Giám mục giáo phận Thái Bình trong dịp 50 năm linh mục và 30 năm Giám mục của ngài. Đức cha xin anh chị em tín hữu cầu nguyện cho các linh mục đang nghỉ hưu, đó là Đức ông Giuse Cẩm và cha G.B. Phạm Ngọc Châu và một số cha cao tuổi đang ốm đau bệnh tật, nhưng vẫn hi sinh dấn thân phục vụ các giáo xứ xa xôi, vùng sâu vùng xa. Thay mặt toàn giáo phận, Đức cha bày tỏ lòng biết ơn chân thành và sâu xa đến quý cha trong giáo phận. Đức cha thật lòng xin lỗi cộng đoàn tín hữu toàn giáo phận, ngài nói: “Anh em linh mục, Giám mục chúng tôi còn rất nhiều thiếu sót và mắc nhiều lầm lỗi trong việc chu toàn nhiệm vụ với Chúa, với Giáo hội và với anh chị em. Chúng tôi thật lòng xin lỗi anh chị em và xin anh chị em hãy cầu nguyện nhiều hơn nữa cho Giám mục, linh mục của anh chị em, để chúng tôi ngày càng cố gắng hơn nữa, sống xứng đáng với lòng tin yêu của anh chị em”.
Sau bài giảng, các linh mục đứng xung quanh Đức giám mục tuyên hứa lại lời hứa khi chịu chức thánh. Tiếp đến ba linh mục rước ba bình dầu bệnh nhân, dầu dự tòng và dầu thánh hiến lên bàn thờ trước mặt Đức giám mục. Trước nhất, Đức giám mục làm phép dầu bệnh nhân và sau lời nguyện hiệp lễ Đức giám mục làm phép dầu dự tòng và dầu thánh hiến.
Cộng đoàn phụng vụ nhận phép lành cuối thánh lễ, liền sau đó Đức giám mục và quý cha đồng tế rước ba bình dầu về phòng khách nhà xứ, để các cha xứ lãnh nhận về các giáo xứ của mình.
Tin Giáo phận
Sinh hoạt khác
Tin Giáo Hội
Mục tổng hợp
Liên kết web
Bài viết được quan tâm
Tòa Giám Mục Thái Bình
Số 6, Trần Hưng Đạo, Tp.Thái Bình, tỉnh Thái Bình
ĐT: 0363 831 361 - Email: bantruyenthonggptb@gmail.com


text:
Nhạc sĩ: Đang Cập Nhật (VN) Album: Tiền (Mp3) Thể loại: Nhạc Trẻ Lượt nghe: 17,109
Vương Quốc Âm Nhạc trên Fb

markdown:
Nhạc sĩ: Đang Cập Nhật (VN)
Album:
[Tiền (Mp3)](http://nhac.vui.vn/tien-mp3-luu-chi-vy-a13498p246.html)
Thể loại:
[Nhạc Trẻ](http://nhac.vui.vn/nhac-tre-c3.html)
Lượt nghe: 17,109
|
|![]()
|
|
Người Đi Ngoài Phố
Người đi đi ngoài phố, chiều nắng tắt bên sông
## Lời bài hát: Người Đi Ngoài Phố - Lưu Chí Vỹ
Phiên bản 1/1
Người đóng góp: Administrator
Người đi đi ngoài phố, bóng dáng xưa mịt mù
Thành ghế đá chiều công viên
Ngày xưa, ngày xưa, ngày xưa đã hết rồi...
Người đi đi ngoài phố, chiều bỡ ngỡ bơ vơ
Người đi đi ngoài phố, mấy dấu chân lạc loài
Hình bóng cũ người yêu ơi
Còn đâu, còn đâu? Tình duyên đã lỡ làng
Thôi chia tay nhau từ đây, nghe nước mắt vây quanh
Biết lỡ yêu đương, sẽ đau thương suốt cả cuộc đời,
Nhưng mấy khi tình đầu, kết thành duyên mong ước
Mấy khi tình đầu, kết trọn mộng đâu em
Xin từ giã đường phố trắng mưa ngâu
làm chim bay mỏi cánh
Nước mắt đêm tạ từ
Thành phố cũ người yêu xưa
Còn đâu, còn đâu? Giờ đây xin giã từ

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

X-CacheDebug-7: Starting wrote cachefile /home/nhacvui/cache/quickcache/30/d1/qcc-d1f1b91e35f2a6410c386a9e3930fe84

X-CacheDebug-8: quickcache_filewrite wrote cachefile /home/nhacvui/cache/quickcache/30/d1/qcc-d1f1b91e35f2a6410c386a9e3930fe84

X-Cache: QuickCache vv2.1.1rc1 - file

Vary: Accept-Encoding,User-Agent

X-CacheDebug-2: Cache varkey is set to GET=a:2:{s:13:"SERVER_REGION";s:2:"US";s:7:"web_url";s:54:"nguoi-di-ngoai-pho-luu-chi-vy-m176935c3p246a13498.html";}

X-CacheDebug-1: Cache scriptkey is set to /index.php

X-CacheDebug-4: No (valid) cachedata for d1f1b91e35f2a6410c386a9e3930fe84

X-CacheDebug-3: Cachekey is set to d1f1b91e35f2a6410c386a9e3930fe84

Content-Type: text/html; charset=UTF-8

X-CacheDebug-6: Writing cached data to storage

X-CacheDebug-11: Successfully wrote cachefile /home/nhacvui/cache/quickcache/30/d1/qcc-d1f1b91e35f2a6410c386a9e3930fe84

X-CacheDebug-5: Callback happened


text:
Thể loại:1326
Bách khoa toàn thư mở Wikipedia
Thể loại con
Thể loại này gồm 8 thể loại con sau, trên tổng số 8 thể loại con.
1
- ► 1326 theo quốc gia (trống)
C
- ► Chấm dứt năm 1326 (trống)
- ► Chính trị 1326 (trống)
K
- ► Khởi đầu năm 1326 (trống)
L
- ► Luật năm 1326 (trống)
M
- ► Mất 1326 (2 tr.)
S
- ► Sinh 1326 (3 tr.)
X
- ► Xung đột năm 1326 (trống)
Các trang trong thể loại “1326”
Thể loại này gồm trang sau.

markdown:
# Thể loại:1326
Bách khoa toàn thư mở Wikipedia
|
|![]()
|Wikimedia Commons có thêm thư viện hình ảnh và phương tiện truyền tải về
|
## Thể loại con
Thể loại này gồm 8 thể loại con sau, trên tổng số 8 thể loại con.
### 1
- ►
[1326 theo quốc gia](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:1326_theo_qu%E1%BB%91c_gia) (trống)
### C
- ►
[Chấm dứt năm 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Ch%E1%BA%A5m_d%E1%BB%A9t_n%C4%83m_1326) (trống)
- ►
[Chính trị 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Ch%C3%ADnh_tr%E1%BB%8B_1326) (trống)
### K
- ►
[Khởi đầu năm 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Kh%E1%BB%9Fi_%C4%91%E1%BA%A7u_n%C4%83m_1326) (trống)
### L
- ►
[Luật năm 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Lu%E1%BA%ADt_n%C4%83m_1326) (trống)
### M
- ►
[Mất 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:M%E1%BA%A5t_1326) (2 tr.)
### S
- ►
[Sinh 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Sinh_1326) (3 tr.)
### X
- ►
[Xung đột năm 1326](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Xung_%C4%91%E1%BB%99t_n%C4%83m_1326) (trống)
## Các trang trong thể loại “1326”
Thể loại này gồm trang sau.

Set-Cookie: GeoIP=US:VA:Ashburn:39.02:-77.54:v4; Path=/; secure; Domain=.wikipedia.org

X-Content-Type-Options: nosniff

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

Via: 1.1 varnish, 1.1 varnish

Content-Language: vi

X-UA-Compatible: IE=Edge

X-Cache: cp1066 miss, cp1068 miss

Vary: Accept-Encoding,Cookie,Authorization

Accept-Ranges: bytes


text:
- 03:45 PM 14/01/2013 #261
Có mẹ nào thông thái giải thích hộ cái: phân biệt câu KỂ và câu TẢ.
Thường đầu bài cho 1 đoạn văn ngắn, sau đó có câu hỏi kiểu như: Các câu trên có nội dung KỂ hay TẢ, tại sao ?
Mình search trên Google không thấy, mà sách vở của con cũng kg đề cập, Bố mẹ nào có biết giải thích giùm cái, cảm ơn nhìu.,
-
CHỦ ĐỀ NỔI BẬT TRÊN WEBTRETHO
-
- 11:29 PM 15/01/2013 #262
Đây là theo bài chữa trong vở của con nhà em ở lớp học thêm:
Câu kể: Hôm nay, chúng em được học ngoại khóa ở trung tâm Panasonic Risupia. ( nêu thông báo về sự việc)
Câu tả: Khu trưng bày sản phẩm trong trung tâm không rộng lắm nhưng rất khang trang, đẹp mắt, với khá nhiều thiết bị hiện đại. ( tái hiện hình ảnh về sự vật)
- 11:21 AM 17/01/2013 #263
- 11:27 AM 17/01/2013 #264
Đợt rồi, lạnh rét quá các con học thêm ở TD nghỉ học hết, ở HM mình k rõ mà cũng quên k hỏi đứa bạn.
Tuần trước gặp nó, nó đang kêu trời kêu đất vì tan ở trường hối hả đễn cho kịp học, tối về khuya, nhà xa gần chục kms về đến nhà gần 10h đêm, lao vội vào ăn + học bài, mình quá khâm phục luôn về nghị lực, chịu khó của PH cũng như các con.
Chẳng biết nói gì, chỉ mong các con sức khoẻ, an toàn, học tốt để đạt thành tích xứng tầm công sức bố mẹ vất vả hàng ngày.
- 02:23 PM 17/01/2013 #265
Tính đến ngày thi còn 4.5 tháng nữa, mình lo lắng thắt ruột. Mà thời tiết lại khắc nghiệt thế này.
Còn bao nội dung toán phải tua đi tua lại nữa, mà khó nhất là hình học, chuyển động, phần trăm, logic. Lại còn 1 lô tiếng Việt nữa. Còn phải thi HSG cấp trường/quận, thi Toán mạng Violimpic...ặc ặc.
Sao trẻ giờ khổ thế không biết nữa.
Đang nghe ngóng xem năm nay Học mãi còn tổ chức thi thử 2 tuần 1 bài như năm ngoái không nữa, Cái đó rất cần thiết để các con rèn bản lĩnh đi thi.
Một vài thày cô mở lớp luyện thi đề Ams cũ, đề thi vào lớp chọn. Các mẹ có cho con đi luyện đề không ?
- 05:11 PM 17/01/2013 #266
Con nhà mình mới lớp 4 mà đa thấy lo rồi.
- 12:45 PM 21/01/2013 #267
- 03:47 PM 21/01/2013 #268
- 12:36 PM 23/01/2013 #269
Con nhà mình năm nay lớp 5 học nhàn tênh, hay tại mình cũng AQ nhỉ? ở quận thì năm nay bỏ hẳn thi học sinh giỏi cấp quận, vậy nên trường cũng chẳng có đội tuyển gì cả, cũng chẳng học thêm ở học mãi hay Trí Đức gì cả, không ra Trung tâm chỉ học 1 nhóm các bạn, cũng chẳng biết con ở vị trí nào nữa, cái khí thế hừng hực của những năm trước để mong muốn cho con vào Ams cũng giảm bớt nhiệt rồi. Tóm lại là mình cũng mong muốn cho con có tuổi thơ, nên đỗ cũng tốt, không cũng chẳng sao cả.Nói thế lại giảm nhiệt của các mẹ rùi, biết đây ăn tết xong, mình lại xốc tinh thần lên chút nhỉ.
- 01:42 PM 23/01/2013 #270
Trước công nhận thì cũng khí thế chút AMS, nhưng giờ chả có gì phải lăn tăn cả, chỉ có mỗi đáp án là k đỗ AMS vẫn tiếp cấp 1 lên, chả đi đâu khác, hic.
Tớ với bạn khéo ra ngoài nói chuyện riêng k làm nhụt chí các mẹ đấy, chúc mẹ cháu và con trai vẫn học giỏi và sức khoẻ nhé.
- 03:10 PM 23/01/2013 #271
Bạn có thể cho mình biết thông tin Cô Ngân ko ?
- 01:29 PM 30/01/2013 #272
Có cái hình cũng lượm được trên WTT, quá đẹp, lấy hình này để cho các con nghiên cứu tả không khí tết, tả việc gói bánh chưng...chuẩn bị cho những bài văn HSG thi đợt tới.
- 02:34 PM 04/02/2013 #273
- 03:08 PM 04/02/2013 #274
- 08:58 PM 15/02/2013 #275
Em thử đăng ký cho con học ở Học mãi 01 tháng em Stop luôn.
Ban đầu hai mẹ con cũng hăng hái ngồi học với nhau lắm. Sau suy cho cùng ngồi học cái mớ bòng bong rốt cục để làm gì?
Nhìn con bé hàng xóm nhà em, học trung tâm học Mãi, học Trung tâm Trí Đức, rồi học một thầy toán nổi tiếng nữa, ăn cơm được 5 phút đã lên học, em thấy khổ quá, mất hết tuổi hồng của nó. Thấy kể đêm hôm đưa đi đón về đã chết mệt rồi.
- 01:55 PM 17/02/2013 #276
- 01:11 PM 19/02/2013 #277
Các mẹ ơi hết tết rồi còn có mấy tháng nữa thôi,tình hình các con thế nào rồi hả các mẹ,mình thì sốt ruột mà thấy bé Rùa nhà mình cứ nhơn nhơ như không lúc nào hỏi cũng con đang ôn luyện đấy chứ có nghỉ đâu...mà thấy con chơi dài à.hu hu không biết tình hình thi cứ thế nào.Chúc các con năm nay đạt được ước mơ của mình nhé.
- 01:18 PM 19/02/2013 #278
- 01:46 PM 19/02/2013 #279
1. Ôn lại kiến thức (khi học theo từng dạng, các cháu quen với dạng đó nên việc giải bài tương tự cùng dạng là dễ dàng, Khi làm đề, nhiều dạng khác nhau cùng lúc ==> các cháu cần suy nghĩ, động não nhiều hơn)
2. Qua làm đề, biết phần nào cần bổ sung, phần nào yếu.
3. Qua các câu làm sai, cần rút ra kinh nghiệm, lập các tips để ôn tập, tránh nhầm lẫn sai sót lần sau
4. Rèn luyện tâm lý khi thi....
Trước mắt cứ làm lại đề các năm trước của 1 số trường điểm. Nếu cần thêm đề, ChuTieu sẽ soạn và gửi lên sau.
Đề thi các năm trước hình như ChuTieu đã post rồi....Mời ghé thăm blog và download tài liệu: http://chutieuthichhoctoan.wordpress.com/
- 02:34 PM 19/02/2013 #280
Bài tương tự
- Đồng hành cùng con vào học chương trình tiểu học song ngữ, Bước 1: Cùng học Phonics & Reading với con
- Đồng hành cùng con lớp 5 chuẩn bị thi cấp 2 AMS - Tầng 3
- Thử thách :" Đồng hành cùng con bài học ở trưởng"
- Đồng hành cùng con học lớp 5, chuẩn bị thi Ams 6
- Cha mẹ đồng hành cùng con suốt quãng đời thơ ấu

markdown:
- 03:45 PM 14/01/2013
[#261]
Có mẹ nào thông thái giải thích hộ cái: phân biệt câu KỂ và câu TẢ.
Thường đầu bài cho 1 đoạn văn ngắn, sau đó có câu hỏi kiểu như: Các câu trên có nội dung KỂ hay TẢ, tại sao ?
Mình search trên Google không thấy, mà sách vở của con cũng kg đề cập, Bố mẹ nào có biết giải thích giùm cái, cảm ơn nhìu.,
-
## CHỦ ĐỀ NỔI BẬT TRÊN WEBTRETHO
-
- 11:29 PM 15/01/2013
[#262]
Đây là theo bài chữa trong vở của con nhà em ở lớp học thêm:
Câu kể: Hôm nay, chúng em được học ngoại khóa ở trung tâm Panasonic Risupia. ( nêu thông báo về sự việc)
Câu tả: Khu trưng bày sản phẩm trong trung tâm không rộng lắm nhưng rất khang trang, đẹp mắt, với khá nhiều thiết bị hiện đại. ( tái hiện hình ảnh về sự vật)
- 11:21 AM 17/01/2013
[#263]
- 11:27 AM 17/01/2013
[#264]
Đợt rồi, lạnh rét quá các con học thêm ở TD nghỉ học hết, ở HM mình k rõ mà cũng quên k hỏi đứa bạn.
Tuần trước gặp nó, nó đang kêu trời kêu đất vì tan ở trường hối hả đễn cho kịp học, tối về khuya, nhà xa gần chục kms về đến nhà gần 10h đêm, lao vội vào ăn + học bài, mình quá khâm phục luôn về nghị lực, chịu khó của PH cũng như các con.
Chẳng biết nói gì, chỉ mong các con sức khoẻ, an toàn, học tốt để đạt thành tích xứng tầm công sức bố mẹ vất vả hàng ngày.
- 02:23 PM 17/01/2013
[#265]
Tính đến ngày thi còn 4.5 tháng nữa, mình lo lắng thắt ruột. Mà thời tiết lại khắc nghiệt thế này.
Còn bao nội dung toán phải tua đi tua lại nữa, mà khó nhất là hình học, chuyển động, phần trăm, logic. Lại còn 1 lô tiếng Việt nữa. Còn phải thi HSG cấp trường/quận, thi Toán mạng Violimpic...ặc ặc.
Sao trẻ giờ khổ thế không biết nữa.
Đang nghe ngóng xem năm nay Học mãi còn tổ chức thi thử 2 tuần 1 bài như năm ngoái không nữa, Cái đó rất cần thiết để các con rèn bản lĩnh đi thi.
Một vài thày cô mở lớp luyện thi đề Ams cũ, đề thi vào lớp chọn. Các mẹ có cho con đi luyện đề không ?
- 05:11 PM 17/01/2013
[#266]
Con nhà mình mới lớp 4 mà đa thấy lo rồi.
- 12:45 PM 21/01/2013
[#267]
- 03:47 PM 21/01/2013
[#268]
- 12:36 PM 23/01/2013
[#269]
Con nhà mình năm nay lớp 5 học nhàn tênh, hay tại mình cũng AQ nhỉ? ở quận thì năm nay bỏ hẳn thi học sinh giỏi cấp quận, vậy nên trường cũng chẳng có đội tuyển gì cả, cũng chẳng học thêm ở học mãi hay Trí Đức gì cả, không ra Trung tâm chỉ học 1 nhóm các bạn, cũng chẳng biết con ở vị trí nào nữa, cái khí thế hừng hực của những năm trước để mong muốn cho con vào Ams cũng giảm bớt nhiệt rồi. Tóm lại là mình cũng mong muốn cho con có tuổi thơ, nên đỗ cũng tốt, không cũng chẳng sao cả.Nói thế lại giảm nhiệt của các mẹ rùi, biết đây ăn tết xong, mình lại xốc tinh thần lên chút nhỉ.
- 01:42 PM 23/01/2013
[#270]
Trước công nhận thì cũng khí thế chút AMS, nhưng giờ chả có gì phải lăn tăn cả, chỉ có mỗi đáp án là k đỗ AMS vẫn tiếp cấp 1 lên, chả đi đâu khác, hic.
Tớ với bạn khéo ra ngoài nói chuyện riêng k làm nhụt chí các mẹ đấy, chúc mẹ cháu và con trai vẫn học giỏi và sức khoẻ nhé.
- 03:10 PM 23/01/2013
[#271]
Bạn có thể cho mình biết thông tin Cô Ngân ko ?
- 01:29 PM 30/01/2013
[#272]
Có cái hình cũng lượm được trên WTT, quá đẹp, lấy hình này để cho các con nghiên cứu tả không khí tết, tả việc gói bánh chưng...chuẩn bị cho những bài văn HSG thi đợt tới.
- 02:34 PM 04/02/2013
[#273]
- 03:08 PM 04/02/2013
[#274]
- 08:58 PM 15/02/2013
[#275]
Em thử đăng ký cho con học ở Học mãi 01 tháng em Stop luôn.
Ban đầu hai mẹ con cũng hăng hái ngồi học với nhau lắm. Sau suy cho cùng ngồi học cái mớ bòng bong rốt cục để làm gì?
Nhìn con bé hàng xóm nhà em, học trung tâm học Mãi, học Trung tâm Trí Đức, rồi học một thầy toán nổi tiếng nữa, ăn cơm được 5 phút đã lên học, em thấy khổ quá, mất hết tuổi hồng của nó. Thấy kể đêm hôm đưa đi đón về đã chết mệt rồi.
- 01:55 PM 17/02/2013
[#276]
- 01:11 PM 19/02/2013
[#277]
Các mẹ ơi hết tết rồi còn có mấy tháng nữa thôi,tình hình các con thế nào rồi hả các mẹ,mình thì sốt ruột mà thấy bé Rùa nhà mình cứ nhơn nhơ như không lúc nào hỏi cũng con đang ôn luyện đấy chứ có nghỉ đâu...mà thấy con chơi dài à.hu hu không biết tình hình thi cứ thế nào.Chúc các con năm nay đạt được ước mơ của mình nhé.
- 01:18 PM 19/02/2013
[#278]
- 01:46 PM 19/02/2013
[#279]
1. Ôn lại kiến thức (khi học theo từng dạng, các cháu quen với dạng đó nên việc giải bài tương tự cùng dạng là dễ dàng, Khi làm đề, nhiều dạng khác nhau cùng lúc ==> các cháu cần suy nghĩ, động não nhiều hơn)
2. Qua làm đề, biết phần nào cần bổ sung, phần nào yếu.
3. Qua các câu làm sai, cần rút ra kinh nghiệm, lập các tips để ôn tập, tránh nhầm lẫn sai sót lần sau
4. Rèn luyện tâm lý khi thi....
Trước mắt cứ làm lại đề các năm trước của 1 số trường điểm. Nếu cần thêm đề, ChuTieu sẽ soạn và gửi lên sau.
Đề thi các năm trước hình như ChuTieu đã post rồi....
**Mời ghé thăm blog và download tài liệu:** [http://chutieuthichhoctoan.wordpress.com/](http://chutieuthichhoctoan.wordpress.com/)
- 02:34 PM 19/02/2013
[#280]
## Bài tương tự
-
[Đồng hành cùng con vào học chương trình tiểu học song ngữ, Bước 1: Cùng học Phonics & Reading với con](http://www.webtretho.com/forum/f54/dong-hanh-cung-con-vao-hoc-chuong-trinh-tieu-hoc-song-ngu-buoc-1-cung-hoc-phonics-and-reading-voi-con-978928/)
-
[Đồng hành cùng con lớp 5 chuẩn bị thi cấp 2 AMS - Tầng 3](http://www.webtretho.com/forum/f54/dong-hanh-cung-con-lop-5-chuan-bi-thi-cap-2-ams-tang-3-a-1709099/)
-
[Thử thách :" Đồng hành cùng con bài học ở trưởng"](http://www.webtretho.com/forum/f3330/thu-thach-dong-hanh-cung-con-bai-hoc-o-truong-1630370/)
-
[Đồng hành cùng con học lớp 5, chuẩn bị thi Ams 6](http://www.webtretho.com/forum/f54/dong-hanh-cung-con-hoc-lop-5-chuan-bi-thi-ams-6-a-496657/)
-
[Cha mẹ đồng hành cùng con suốt quãng đời thơ ấu](http://www.webtretho.com/forum/f55/cha-me-dong-hanh-cung-con-suot-quang-doi-tho-au-105931/)

WARC-Truncated: length

Set-Cookie: vbseo_loggedin=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

Server: PEN

Pragma: private

Cache-Control: none cached

Vary: Accept-Encoding

X-Cached: MISS


text:
Lyrurus tetrix
Bách khoa toàn thư mở Wikipedia
Lyrurus tetrix là một loài chim trong họ Phasianidae.[2]
Chú thích[sửa | sửa mã nguồn]
- ^ “Tetrao tetrix”. IUCN Red List of Threatened Species™. International Union for Conservation of Nature. Truy cập ngày 25 tháng 1 năm 2012.
- ^ Clements, J. F., T. S. Schulenberg, M. J. Iliff, B.L. Sullivan, C. L. Wood, and D. Roberson (2012). “The eBird/Clements checklist of birds of the world: Version 6.7.”. Truy cập ngày 19 tháng 12 năm 2012.

markdown:
*Lyrurus tetrix*
Bách khoa toàn thư mở Wikipedia
|
|Lyrurus tetrix
|
|![]()
con mái
![ Black Grouse Nationalpark Bayerischer Wald.jpg](//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Black_Grouse_Nationalpark_Bayerischer_Wald.jpg/280px-Black_Grouse_Nationalpark_Bayerischer_Wald.jpg)
![ Black Grouse Nationalpark Bayerischer Wald.jpg](http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Black_Grouse_Nationalpark_Bayerischer_Wald.jpg/280px-Black_Grouse_Nationalpark_Bayerischer_Wald.jpg)
con trống
[Tình trạng bảo tồn](/wiki/T%C3%ACnh_tr%E1%BA%A1ng_b%E1%BA%A3o_t%E1%BB%93n) [Phân loại khoa học](/wiki/Ph%C3%A2n_lo%E1%BA%A1i_sinh_h%E1%BB%8Dc) [Giới](/wiki/Gi%E1%BB%9Bi_(sinh_h%E1%BB%8Dc))( *regnum*) [Animalia](/wiki/%C4%90%E1%BB%99ng_v%E1%BA%ADt) [Ngành](/wiki/Ng%C3%A0nh_(sinh_h%E1%BB%8Dc))( *phylum*) [Chordata](/wiki/%C4%90%E1%BB%99ng_v%E1%BA%ADt_c%C3%B3_d%C3%A2y_s%E1%BB%91ng) [Lớp](/wiki/L%E1%BB%9Bp_(sinh_h%E1%BB%8Dc))( *class*) [Aves](/wiki/Chim) [Bộ](/wiki/B%E1%BB%99_(sinh_h%E1%BB%8Dc))( *ordo*) [Galliformes](/wiki/B%E1%BB%99_G%C3%A0) [Họ](/wiki/H%E1%BB%8D_(sinh_h%E1%BB%8Dc))( *familia*) [Phasianidae](/wiki/H%E1%BB%8D_Tr%C4%A9) [Chi](/wiki/Chi_(sinh_h%E1%BB%8Dc))( *genus*) [Lyrurus](/w/index.php?title=Lyrurus&action=edit&redlink=1) [Loài](/wiki/Lo%C3%A0i)( *species*) **L. tetrix** [Danh pháp hai phần](/wiki/Danh_ph%C3%A1p_hai_ph%E1%BA%A7n) *Lyrurus tetrix*
(
[Linnaeus](/wiki/Carl_von_Linn%C3%A9), [1758](/wiki/1758)) ![ Lyrurus tetrix distribution.png](//upload.wikimedia.org/wikipedia/commons/thumb/2/26/Lyrurus_tetrix_distribution.png/280px-Lyrurus_tetrix_distribution.png)
![ Lyrurus tetrix distribution.png](http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Lyrurus_tetrix_distribution.png/280px-Lyrurus_tetrix_distribution.png)
[Danh pháp đồng nghĩa](/wiki/T%C3%AAn_%C4%91%E1%BB%93ng_ngh%C4%A9a_(sinh_v%E1%BA%ADt_h%E1%BB%8Dc)) *Tetrao tetrix*( [Linnaeus](/wiki/Carl_von_Linn%C3%A9), 1758) * là một loài Lyrurus tetrix* [chim](/wiki/Chim)trong họ [Phasianidae](/wiki/H%E1%BB%8D_Tr%C4%A9). [[2]](#cite_note-2)
## Chú thích[
[sửa](/w/index.php?title=Lyrurus_tetrix&veaction=edit&vesection=1) | [sửa mã nguồn](/w/index.php?title=Lyrurus_tetrix&action=edit§ion=1)] [^](#cite_ref-redlistsummary_1-0) [“Tetrao tetrix”](http://www.iucnredlist.org/apps/redlist/details/100600293/0). *IUCN Red List of Threatened Species™*. [International Union for Conservation of Nature](/w/index.php?title=International_Union_for_Conservation_of_Nature&action=edit&redlink=1). Truy cập ngày 25 tháng 1 năm 2012. **Clements, J. F., T. S. Schulenberg, M. J. Iliff, B.L. Sullivan, C. L. Wood, and D. Roberson (2012).** [^](#cite_ref-2) [“The eBird/Clements checklist of birds of the world: Version 6.7.”](http://www.birds.cornell.edu/clementschecklist/downloadable-clements-checklist). Truy cập ngày 19 tháng 12 năm 2012.
## Liên kết ngoài[
[sửa](/w/index.php?title=Lyrurus_tetrix&veaction=edit&vesection=2) | [sửa mã nguồn](/w/index.php?title=Lyrurus_tetrix&action=edit§ion=2)]
|
|![]()
|
| có thông tin sinh học về Lyrurus tetrix


text:
...loại rủi ro pháp lý, nắm cơ hội làm giàu...
ỦY
BAN NHÂN DÂN
TỈNH THỪA THIÊN HUẾ
*****
CỘNG
HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc
*******
Số:
38/2007/CT-UBND
Huế,
ngày 05 tháng 10 năm 2007
VỀ
VIỆC KHẮC PHỤC HẬU QUẢ CƠN BÃO SỐ 5 (LEKIMA)
Do ảnh hưởng của cơn bão số 5, liên tiếp trong các
ngày từ 30/09 đến ngày 03/10/2007 trên địa bàn toàn tỉnh đã có mưa vừa đến mưa
to, có nơi mưa rất to; gió bão cấp 8, cấp 9, giật trên cấp 9 cùng với
lượng mưa lớn trên diện rộng, kết hợp với triều cường đã làm mực nước ở các
sông dâng cao.
Để vừa khắc
phục những hậu quả do ảnh hưởng của cơn bão gây ra, vừa phải đối phó với lũ và
chuẩn bị phòng, chống với các cơn bão có khả năng xuất hiện ảnh hưởng trực tiếp
đến tỉnh nhà, UBND tỉnh yêu cầu các cấp chính quyền, các ban ngành đoàn thể tập
trung triển khai thực hiện một số nhiệm vụ sau:
1. Chủ tịch UBND các
huyện, thành phố Huế tập trung chỉ đạo thực hiện các biện pháp khắc phục hậu
quả của cơn bão, sớm ổn định đời sống của nhân dân; kiểm tra, thống kê, báo cáo
tình hình thiệt hại; phối hợp với Công ty
TNHH Nhà nước 1TV Môi trường và Công trình đô thị Huế huy động phương
tiện, lực lượng, chỉ đạo các phường, xã tổ chức ra quân làm sạch vệ sinh môi
trường; vận động nhân dân tham gia dọn cây đổ, rác thải, bùn non...; hạn chế
thấp nhất tình trạng ô nhiễm nguồn nước sinh hoạt của nhân dân và phòng chống
dịch bệnh có thể xảy ra.
2. Các Sở:
Giao thông vận tải, Nông nghiệp và PTNT, Thủy sản, Xây dựng, Bưu chính viễn
thông; Điện lực Thừa Thiên Huế và các Sở, ngành liên quan kiểm tra, thống kê
tình hình thiệt hại của ngành, có kế hoạch tổ chức khôi phục, sửa chữa đảm bảo
giao thông thông suốt, thủy lợi phục vụ cho sản xuất nông nghiệp, nuôi tròng
thủy sản, hệ thống nước sinh hoạt, công nghiệp, điện, thông tin liên lạc,...
3. Sở Y tế tổ
chức hướng dẫn, giúp các địa phương, nhân dân biện pháp đảm bảo vệ sinh ăn uống
thực phẩm, phòng chống dịch bệnh và xử lý vệ sinh môi trường.
4. Ban chỉ
huy PCLB và TKCN tỉnh phối hợp với UBND các huyện và thành phố Huế, các Sở, ban
ngành kiểm tra tình hình, thống kê số lượng thiệt hại, báo cáo UBND tỉnh để kịp
thời khắc phục và tổng hợp báo cáo Trung ương.
Nhận được Chỉ thị này
yêu cầu các cấp, các ngành khẩn trương triển khai thực hiện./.
Nơi nhận:
- BCĐ PCLB Trung ương;
- TVTU, TT HĐND tỉnh;
- UBND các huyện, TP Huế;
- Các CQ ban ngành đoàn thể cấp tỉnh;
- VP: LĐ và CV: GT, NN;
- Lưu VT, LT.
TM. UỶ BAN NHÂN DÂN
KT.CHỦ TỊCH
PHÓ CHỦ TỊCH
Ngô Hòa
Tags:
38/2007/CT-UBND, CHI THI 38 2007, TINH THUA THIEN HUE, TAI NGUYEN - MOI TRUONG
Email nhận thông báo:

Set-Cookie: Culture=vi; domain=thuvienphapluat.vn; expires=Sun, 28-May-2017 04:09:12 GMT; path=/

X-Frame-Options: SAMEORIGIN


text:
Nơi an táng Đại tướng Võ Nguyên Giáp đã được bảo vệ
Bộ đội mở đường mới vào nơi an nghỉ của Đại tướng
Hình ảnh cập nhật lễ viếng Đại tướng Võ Nguyên Giáp ngày 9/10
Câu chuyện ít người biết về Đại tướng Võ Nguyên Giáp
Con gái Đại tướng Võ Nguyên Giáp nói về nơi an nghỉ của cha
Bí thư tỉnh ủy Quảng Bình: Sẵn sàng đón linh cữu Đại tướng
Nơi an táng của Đại tướng Võ Nguyên Giáp ở khu vực Vũng Chùa-Đảo Yến (xã Quảng Đông, huyện Quảng Trạch, tỉnh Quảng Bình).
Nơi an táng Đại tướng Võ Nguyên Giáp: Tháp chuông trong khu vực núi Xóm Mới, mặt hướng nhìn ra Đảo Yến. Ảnh: T.Q.N
Nếu đi từ Hà Nội, phải qua Đèo Ngang, đi thêm khoảng 6-7 km, sau đó rẽ trái đi về hướng biển là tới nơi sẽ chôn cất thi hài Đại tướng.
Tuy nhiên, trao đổi với Chất lượng Việt Nam, Đại diện lãnh đạo xã Quảng Đông cho biết, nơi đây vẫn chưa có điện, do ảnh hưởng của bão số 10 vừa qua. Hiện đang kéo điện từ Hòn La tới, nên vài hôm nữa mới có.
Mặt khác, chỗ Đại tướng an táng, người dân chưa được vào, do các đơn vị đang tiến hành san lấp mặt bằng và làm khoảng 1km đường mới.
Vì vậy, người dân hoặc các cơ quan muốn nghỉ ngơi, có thể phải tới trung tâm huyện Quảng Trạch. Nếu đi từ Hà Nội, qua Đèo Ngang, đi 6-7 km, đến ngã tư rẽ phải, đi khoảng 20 km sẽ đến trung tâm huyện Quảng Trạch, có chỗ để nghỉ ngơi.
Hiện nay, khu vực an táng của Đại tướng đang được quân đội bảo vệ.
Sáng nay, tỉnh Quảng Bình cho biết, Lễ viếng Đại tướng được tổ chức tại hội trường UBND tỉnh, thời gian từ 7 giờ 30 phút đến 20 giờ ngày 12-10. Lễ truy điệu, thời gian từ 7 giờ ngày 13-10, tại hội trường UBND tỉnh.
Lễ an táng, địa điểm tại Vũng Chùa-Đảo Yến, xã Quảng Đông, huyện Quảng Trạch... UBND tỉnh cũng đã phân công trách nhiệm cho các cơ quan, đơn vị trong tổ chức Lễ truy điệu, Lễ viếng, đón linh cữu và Lễ an táng Đại tướng.
Ngay từ sáng 8/10, Sở Giao thông-vận tải tỉnh Quảng Bình đã điều động lực lượng, phương tiện rà phá mìn, sửa chữa và mở tuyến đường cơ động vào vị trí an táng, dài khoảng 1km; dự kiến sẽ hoàn thành trong hai ngày.
Đại tá Nguyễn Văn Hiếu, Chỉ huy trưởng Bộ CHQS tỉnh Quảng Bình cho biết: Theo kế hoạch, đội tiêu binh danh dự Quân đội nhân dân Việt Nam từ Hà Nội sẽ cơ động vào đảm nhiệm thực hiện các nghi thức lễ an táng trọng thể, trang nghiêm; 25 xe tiêu binh và xe chở thi hài Đại tướng Võ Nguyên Giáp được điều động từ Quân khu 7 (TP Hồ Chí Minh) ra Quảng Bình bằng đường sắt.
BÀI ĐỌC NHIỀU VỀ VÕ NGUYÊN GIÁP
Chi tiết lịch trình tang lễ Đại tướng Võ Nguyên Giáp
Truyền hình trực tiếp Lễ tang Đại tướng Võ Nguyên Giáp
Lễ tang Đại tướng Võ Nguyên Giáp: 5h sáng 12/10 tiến hành khâm liệm
Cả nước treo cờ rủ để tang Đại tướng Võ Nguyên Giáp
Tang lễ Đại tướng Võ Nguyên Giáp: Sao lại chọn máy bay ATR72?
Hết giờ người dân vẫn kiên trì xếp hàng trước cửa gia đình Đại tướng
Tang lễ Đại tướng Võ Nguyên Giáp: đi bộ 2km sẽ đến nơi an táng
Ngày Quốc tang Đại tướng Võ Nguyên Giáp thời tiết đẹp
1.500 bộ đội bảo vệ khu vực an táng Đại tướng
Hình ảnh cập nhật lễ viếng Đại tướng Võ Nguyên Giáp ngày 10/10
Rút ngắn thời gian viếng Đại tướng Võ Nguyên Giáp
Cấm xe tải 2 ngày quốc tang Đại tướng Võ Nguyên Giáp
Hình ảnh con đường vào nơi an táng Đại tướng
Con gái Đại tướng Võ Nguyên Giáp nói về nơi an nghỉ của cha
Cập nhật hình ảnh mới nhất lễ viếng Đại tướng ngày 9/10
Bộ đội mở đường mới vào nơi an nghỉ của Đại tướng
Hà Nội nên chọn đường nào đặt tên Đại tướng Võ Nguyên Giáp?
Đến viếng Đại tướng Võ Nguyên Giáp: Người dân cần lưu ý điều gì?
Máy bay dân dụng ATR 72 đưa lĩnh cữu Đại tướng về quê
Bí thư tỉnh ủy Quảng Bình: Sẵn sàng đón linh cữu Đại tướng
Đại tướng Võ Nguyên Giáp "về" Quảng Bình bằng máy bay
Khách viếng Đại tướng Võ Nguyên Giáp sẽ đi bằng phương tiện nào?
Hình ảnh đảo Yến nơi yên nghỉ của Đại tướng Võ Nguyên Giáp
Hình ảnh xếp hàng dài nối đuôi nhau viếng Đại tướng Võ Nguyên Giáp
Lễ tang Đại tướng Võ Nguyên Giáp được tổ chức như thế nào?
Cuộc đời và sự nghiệp Đại tướng Võ Nguyên Giáp
Hình ảnh Đại tướng Võ Nguyên Giáp ngập tràn truyền thông quốc tế
Ngày đầu "cầm quân" của Đại tướng Võ Nguyên Giáp
Đại tướng Võ Nguyên Giáp qua ống kính phóng viên quốc tế
Nhật Minh
bình luận (0)

markdown:
# Nơi an táng Đại tướng Võ Nguyên Giáp đã được bảo vệ
![ author](http://vietq.vn/templates/themes/images/icontacgia.png)
**16:09 09/10/2013**
(VietQ.vn) - Hiện nay, khu vực an táng của Đại tướng Võ Nguyên Giáp đã được quân đội bảo vệ. Người dân chưa được vào để các đơn vị đang tiến hành san lấp mặt bằng và làm khoảng 1km đường mới.
### Bộ đội mở đường mới vào nơi an nghỉ của Đại tướng
### Hình ảnh cập nhật lễ viếng Đại tướng Võ Nguyên Giáp ngày 9/10
### Câu chuyện ít người biết về Đại tướng Võ Nguyên Giáp
### Con gái Đại tướng Võ Nguyên Giáp nói về nơi an nghỉ của cha
### Bí thư tỉnh ủy Quảng Bình: Sẵn sàng đón linh cữu Đại tướng
Nơi an táng của Đại tướng Võ Nguyên Giáp ở khu vực Vũng Chùa-Đảo Yến (xã Quảng Đông, huyện Quảng Trạch, tỉnh Quảng Bình).
*Nơi an táng Đại tướng Võ Nguyên Giáp: Tháp chuông trong khu vực núi Xóm Mới, mặt hướng nhìn ra Đảo Yến. Ảnh: T.Q.N*
Nếu đi từ Hà Nội, phải qua Đèo Ngang, đi thêm khoảng 6-7 km, sau đó rẽ trái đi về hướng biển là tới nơi sẽ chôn cất thi hài Đại tướng.
Tuy nhiên, trao đổi với
*Chất lượng Việt Nam*, Đại diện lãnh đạo xã Quảng Đông cho biết, nơi đây vẫn chưa có điện, do ảnh hưởng của bão số 10 vừa qua. Hiện đang kéo điện từ Hòn La tới, nên vài hôm nữa mới có.
Mặt khác, chỗ Đại tướng an táng, người dân chưa được vào, do các đơn vị đang tiến hành san lấp mặt bằng và làm khoảng 1km đường mới.
Vì vậy, người dân hoặc các cơ quan muốn nghỉ ngơi, có thể phải tới trung tâm huyện Quảng Trạch. Nếu đi từ Hà Nội, qua Đèo Ngang, đi 6-7 km, đến ngã tư rẽ phải, đi khoảng 20 km sẽ đến trung tâm huyện Quảng Trạch, có chỗ để nghỉ ngơi.
Hiện nay, khu vực an táng của Đại tướng đang được quân đội bảo vệ.
Sáng nay, tỉnh Quảng Bình cho biết, Lễ viếng Đại tướng được tổ chức tại hội trường UBND tỉnh, thời gian từ 7 giờ 30 phút đến 20 giờ ngày 12-10. Lễ truy điệu, thời gian từ 7 giờ ngày 13-10, tại hội trường UBND tỉnh.
Lễ an táng, địa điểm tại Vũng Chùa-Đảo Yến, xã Quảng Đông, huyện Quảng Trạch... UBND tỉnh cũng đã phân công trách nhiệm cho các cơ quan, đơn vị trong tổ chức Lễ truy điệu, Lễ viếng, đón linh cữu và Lễ an táng Đại tướng.
Ngay từ sáng 8/10, Sở Giao thông-vận tải tỉnh Quảng Bình đã điều động lực lượng, phương tiện rà phá mìn, sửa chữa và mở tuyến đường cơ động vào vị trí an táng, dài khoảng 1km; dự kiến sẽ hoàn thành trong hai ngày.
Đại tá Nguyễn Văn Hiếu, Chỉ huy trưởng Bộ CHQS tỉnh Quảng Bình cho biết: Theo kế hoạch, đội tiêu binh danh dự Quân đội nhân dân Việt Nam từ Hà Nội sẽ cơ động vào đảm nhiệm thực hiện các nghi thức lễ an táng trọng thể, trang nghiêm; 25 xe tiêu binh và xe chở thi hài Đại tướng Võ Nguyên Giáp được điều động từ Quân khu 7 (TP Hồ Chí Minh) ra Quảng Bình bằng đường sắt.
**BÀI ĐỌC NHIỀU VỀ VÕ NGUYÊN GIÁP** *Chi tiết lịch trình tang lễ Đại tướng Võ Nguyên Giáp* **Truyền hình trực tiếp Lễ tang Đại tướng Võ Nguyên Giáp** **Lễ tang Đại tướng Võ Nguyên Giáp: 5h sáng 12/10 tiến hành khâm liệm** **Cả nước treo cờ rủ để tang Đại tướng Võ Nguyên Giáp** [Tang lễ Đại tướng Võ Nguyên Giáp: Sao lại chọn máy bay ATR72?](http://vietq.vn/tang-le-dai-tuong-vo-nguyen-giap-sao-lai-chon-may-bay-atr72-d23234.html) **Hết giờ người dân vẫn kiên trì xếp hàng trước cửa gia đình Đại tướng** **Tang lễ Đại tướng Võ Nguyên Giáp: đi bộ 2km sẽ đến nơi an táng** **Ngày Quốc tang Đại tướng Võ Nguyên Giáp thời tiết đẹp** **1.500 bộ đội bảo vệ khu vực an táng Đại tướng** **Hình ảnh cập nhật lễ viếng Đại tướng Võ Nguyên Giáp ngày 10/10** **Rút ngắn thời gian viếng Đại tướng Võ Nguyên Giáp** **Cấm xe tải 2 ngày quốc tang Đại tướng Võ Nguyên Giáp** **Hình ảnh con đường vào nơi an táng Đại tướng ** **Con gái Đại tướng Võ Nguyên Giáp nói về nơi an nghỉ của cha** **Cập nhật hình ảnh mới nhất lễ viếng Đại tướng ngày 9/10** **Bộ đội mở đường mới vào nơi an nghỉ của Đại tướng** **Hà Nội nên chọn đường nào đặt tên Đại tướng Võ Nguyên Giáp?** [Đến viếng Đại tướng Võ Nguyên Giáp: Người dân cần lưu ý điều gì?](http://vietq.vn/le-tang-dai-tuong-vo-nguyen-giap-duoc-to-chuc-nhu-nao-d22987.html) **Máy bay dân dụng ATR 72 đưa lĩnh cữu Đại tướng về quê** **Bí thư tỉnh ủy Quảng Bình: Sẵn sàng đón linh cữu Đại tướng** **Đại tướng Võ Nguyên Giáp "về" Quảng Bình bằng máy bay ** *Khách viếng Đại tướng Võ Nguyên Giáp sẽ đi bằng phương tiện nào?* **Hình ảnh đảo Yến nơi yên nghỉ của Đại tướng Võ Nguyên Giáp** **Hình ảnh xếp hàng dài nối đuôi nhau viếng Đại tướng Võ Nguyên Giáp** *Lễ tang Đại tướng Võ Nguyên Giáp được tổ chức như thế nào?* **Cuộc đời và sự nghiệp Đại tướng Võ Nguyên Giáp** **Hình ảnh Đại tướng Võ Nguyên Giáp ngập tràn truyền thông quốc tế** *Ngày đầu "cầm quân" của Đại tướng Võ Nguyên Giáp* **Đại tướng Võ Nguyên Giáp qua ống kính phóng viên quốc tế** **Nhật Minh**
## bình luận (0)

Content-Type: text/html; charset: utf-8


text:
Giới thiệu | KHUYẾN MÃI | HOẠT ĐỒNG PHÒNG CHUYÊN GIA NƯỚC | Tin tức | Liên hệ | 8h - 17h30 (Từ Thứ 2 - CN)
(04)3551-0165
MÁY LỌC NƯỚC UỐNG
Máy lọc nước nano
Máy lọc nước r.o
Máy lọc nước nóng lạnh
Máy lọc nước điện giải
Linh kiện máy lọc nước
HỆ THỐNG LỌC NƯỚC
Hệ thống lọc tổng biệt thự
Thiết bị lọc nước khác
Cây nước nóng lạnh
DỊCH VỤ
Giá: Liên hệ
© Công ty TNHH ĐT và TM Enterbuy Việt Nam,114 Khuất Duy Tiến - Nhân Chính - Thanh Xuân - Hà Nội. MST: 0104780033. Điện thoại: 04.355.10165
Email: info@enterbuy.vn
@ Since 2010

Set-Cookie: nv3c_Tzedj_nvvithemever=mw%2C%2C; expires=Tue, 23-May-2017 04:01:51 GMT; path=/; domain=.enterbuy.vn; httponly

Server: nginx centminmod

Cache-Control: private, pre-check=0, post-check=0, max-age=0