5. MyNUnit - #6
Conversation
| var assembly = Assembly.GetExecutingAssembly(); | ||
| var assemblyPath = assembly.Location; |
There was a problem hiding this comment.
Это, наверное, тоже можно в SetUp вынести, во всех тестах оно есть.
| [Before] | ||
| public void Before() | ||
| { | ||
| BeforeWasCalledCount++; |
There was a problem hiding this comment.
По идее Before должен вызываться для каждого экземпляра тестового класса для каждого теста параллельно. А тут делается ++, а не Interlocked.Increment, для статического поля. Если тест проходит, то либо что-то не настолько параллельно, насколько надо, либо просто повезло.
| public static void BeforeClass() | ||
| { | ||
| BeforeClassWasCalled = true; | ||
| } |
There was a problem hiding this comment.
Тут тоже незазорно использовать =>.
| var beforeMethods = type.GetMethods() | ||
| .Where(m => m.GetCustomAttribute<BeforeAttribute>() != null && !m.IsStatic).ToList(); | ||
| var afterMethods = type.GetMethods() | ||
| .Where(m => m.GetCustomAttribute<AfterAttribute>() != null && !m.IsStatic).ToList(); |
There was a problem hiding this comment.
Здесь бы больше проверок на правильность тестов и вспомогательных методов. Например, что тестовый метод не статический, ничего не возвращает и не принимает аргументов. Иначе упадёт при запуске теста, с невнятной ошибкой.
| foreach (var testResult in testsInClass.Select(testInfo => new TestResult( | ||
| testInfo.TestClass.Name, | ||
| testInfo.TestMethod.Name, | ||
| TestStatus.Failed, |
There was a problem hiding this comment.
Он не совсем Failed. Сам тест даже не запускался, с ним, может быть, всё хорошо. Я бы добавил ещё один статус, "Errored" для обозначения тестов, которые не отработали из-за ошибки во вспомогательных методах.
| var actualException = ex is TargetInvocationException tie ? tie.InnerException ?? ex : ex; | ||
| foreach (var result in results) | ||
| { | ||
| result.AddMessage($"\nWarning: AfterClass failed: {actualException.Message}"); |
There was a problem hiding this comment.
Я бы такие тесты тоже как Failed помечал. Всё равно их надо чинить, и вдруг в AfterClass какая-то важная деинициализация, без которой результаты следующих прогонов будут невалидны (например, было бы глупо проверять успешность сборки программы, не удалив старые временные файлы).
| object? testInstance = null; | ||
| if (!testInfo.TestMethod.IsStatic) | ||
| { | ||
| testInstance = Activator.CreateInstance(testInfo.TestClass); |
There was a problem hiding this comment.
Тут тоже может быть брошено исключение, это ведь вызовет конструктор, который может быть определён пользователем.
| /// Gets the type of exception that is expected from the test. | ||
| /// </summary> | ||
| public Type? ExpectedException { get; } = expectedException; | ||
| } No newline at end of file |
There was a problem hiding this comment.
Тут надо было record, а не класс, компилятор бы 4/5 этого файла сам сгенерил :)
| /// Is applied to the methods of the class instance. | ||
| /// </summary> | ||
| [AttributeUsage(AttributeTargets.Method)] | ||
| public class AfterAttribute : Attribute; |
There was a problem hiding this comment.
Атрибуты лучше вынести в отдельную сборку, потому что иначе всем, кто пишет тесты, надо будет линковаться со всем раннером, тогда как им нужны только атрибуты.
No description provided.